common/errors.h (931 lines of code) (raw):

// // 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. // #ifndef THIRD_PARTY_CLOUD_SPANNER_EMULATOR_COMMON_ERRORS_H_ #define THIRD_PARTY_CLOUD_SPANNER_EMULATOR_COMMON_ERRORS_H_ #include <cstdint> #include <string> #include <vector> #include "absl/status/status.h" #include "absl/strings/string_view.h" #include "absl/time/time.h" #include "backend/common/ids.h" namespace google { namespace spanner { namespace emulator { namespace error { // Generic errors. absl::Status Internal(absl::string_view msg); absl::Status CycleDetected(absl::string_view object_type, absl::string_view cycle); // Project errors. absl::Status InvalidProjectURI(absl::string_view uri); // Instance config errors. absl::Status InvalidInstanceConfigURI(absl::string_view uri); absl::Status InstanceConfigNotFound(absl::string_view config_id); // Instance errors. absl::Status InvalidInstanceURI(absl::string_view uri); absl::Status InstanceNotFound(absl::string_view uri); absl::Status InstanceAlreadyExists(absl::string_view uri); absl::Status InstanceNameMismatch(absl::string_view uri); absl::Status InstanceUpdatesNotSupported(); absl::Status InvalidInstanceName(absl::string_view instance_id); absl::Status InvalidCreateInstanceRequestUnitsNotBoth(); absl::Status InvalidCreateInstanceRequestUnitsMultiple(); // Database errors. absl::Status InvalidDatabaseURI(absl::string_view uri); absl::Status DatabaseNotFound(absl::string_view uri); absl::Status DatabaseAlreadyExists(absl::string_view uri); absl::Status CreateDatabaseMissingCreateStatement(); absl::Status InvalidCreateDatabaseStatement(absl::string_view statement); absl::Status UpdateDatabaseMissingStatements(); absl::Status TooManyDatabasesPerInstance(absl::string_view instance_uri); absl::Status InvalidDatabaseName(absl::string_view database_id); absl::Status CannotCreatePostgreSQLDialectDatabase(); // Operation errors. absl::Status InvalidOperationId(absl::string_view id); absl::Status InvalidOperationURI(absl::string_view uri); absl::Status OperationAlreadyExists(absl::string_view uri); absl::Status OperationNotFound(absl::string_view uri); // IAM errors. absl::Status IAMPoliciesNotSupported(); // Label errors absl::Status TooManyLabels(int num); absl::Status BadLabelKey(absl::string_view key); absl::Status BadLabelValue(absl::string_view key, absl::string_view value); // Session errors. absl::Status InvalidSessionURI(absl::string_view uri); absl::Status SessionNotFound(absl::string_view uri); absl::Status TooFewSessions(int session_count); // Missing required field in proto error. absl::Status MissingRequiredFieldError(absl::string_view field); // Type proto errors. absl::Status UnspecifiedType(absl::string_view proto); absl::Status ArrayTypeMustSpecifyElementType(absl::string_view proto); // Value proto errors. absl::Status ValueProtoTypeMismatch(absl::string_view proto, absl::string_view expected_type); absl::Status CouldNotParseStringAsInteger(absl::string_view str); absl::Status CouldNotParseStringAsPgOid(absl::string_view str); absl::Status CouldNotParseStringAsFloat(absl::string_view str); absl::Status CouldNotParseStringAsDouble(absl::string_view str); absl::Status CouldNotParseStringAsNumeric(absl::string_view str); absl::Status CouldNotParseStringAsPgNumeric(absl::string_view str); absl::Status CouldNotParseStringAsJson(absl::string_view str); absl::Status CouldNotParseStringAsPgJsonb(absl::string_view str); absl::Status CouldNotParseStringAsTimestamp(absl::string_view str, absl::string_view error); absl::Status CouldNotParseStringAsInterval(absl::string_view str, absl::string_view error); absl::Status TimestampMustBeInUTCTimeZone(absl::string_view str); absl::Status CouldNotParseStringAsDate(absl::string_view str); absl::Status InvalidDate(absl::string_view str); absl::Status CouldNotParseStringAsBytes(absl::string_view str); absl::Status TimestampOutOfRange(absl::string_view time); absl::Status MultipleValuesForColumn(absl::string_view column); // Key proto errors. absl::Status WrongNumberOfKeyParts(absl::string_view table_or_index_name, int expected_key_parts, int found_key_parts, absl::string_view supplied_key); absl::Status KeyRangeMissingStart(); absl::Status KeyRangeMissingEnd(); // Mutation proto errors. absl::Status BadDeleteRange(absl::string_view start_key, absl::string_view limit_key); absl::Status MutationTableRequired(); // Transaction errors. absl::Status AbortConcurrentTransaction(int64_t requestor_id, int64_t holder_id); absl::Status AbortCurrentTransaction(backend::TransactionID holder_id, backend::TransactionID requestor_id); absl::Status WoundedTransaction(backend::TransactionID id); absl::Status CouldNotObtainLockHandleMutex(backend::TransactionID id); absl::Status CouldNotObtainTransactionMutex(backend::TransactionID id); absl::Status TransactionNotFound(backend::TransactionID id); absl::Status TransactionClosed(backend::TransactionID id); absl::Status InvalidTransactionID(backend::TransactionID id); absl::Status InvalidTransactionType(absl::string_view msg); absl::Status InvalidTransactionUsage(absl::string_view msg, backend::TransactionID id); absl::Status CannotReturnReadTimestampForReadWriteTransaction(); absl::Status InvalidReadOptionForMultiUseTransaction( absl::string_view timestamp_bound); absl::Status InvalidModeForReadOnlySingleUseTransaction(); absl::Status DirectedReadNeedsReadOnlyTxn(); absl::Status DmlDoesNotSupportSingleUseTransaction(); absl::Status DmlSequenceOutOfOrder(int64_t request_seqno, int64_t last_seqno, absl::string_view sql_statement); absl::Status ReplayRequestMismatch(int64_t request_seqno, absl::string_view sql_statement); absl::Status PartitionReadDoesNotSupportSingleUseTransaction(); absl::Status PartitionReadNeedsReadOnlyTxn(); absl::Status CannotCommitRollbackReadOnlyOrPartitionedDmlTransaction(); absl::Status CannotReusePartitionedDmlTransaction(); absl::Status PartitionedDMLOnlySupportsSimpleQuery(); absl::Status NoInsertForPartitionedDML(); absl::Status InvalidOperationUsingPartitionedDmlTransaction(); absl::Status CannotCommitAfterRollback(); absl::Status CannotRollbackAfterCommit(); absl::Status CannotReadOrQueryAfterCommitOrRollback(); absl::Status CannotUseTransactionAfterConstraintError(); absl::Status ReadTimestampPastVersionGCLimit(absl::Time timestamp); absl::Status ReadTimestampTooFarInFuture(absl::Time timestamp); absl::Status AbortDueToConcurrentSchemaChange(backend::TransactionID id); absl::Status AbortReadWriteTransactionOnFirstCommit(backend::TransactionID id); absl::Status UpdateDeletedRowInTransaction(absl::string_view table, absl::string_view key); absl::Status ForeignKeyReferencedRestrictionInTransaction( absl::string_view table, absl::string_view key); // DDL errors. absl::Status EmptyDDLStatement(); absl::Status DDLStatementWithErrors(absl::string_view ddl_string, const std::vector<std::string>& errors); absl::Status DdlInvalidArgumentError(absl::string_view message); absl::Status DdlUnavailableError(); // Schema validation errors. absl::Status InvalidSchemaName(absl::string_view object_kind, absl::string_view identifier); absl::Status SchemaObjectTypeUnsupportedInNamedSchema( absl::string_view object_kind, absl::string_view identifier); absl::Status InvalidConstraintName(absl::string_view constraint_type, absl::string_view constraint_name, absl::string_view reserved_prefix); absl::Status CannotNameIndexPrimaryKey(); absl::Status CannotCreateIndexOnColumn(absl::string_view index_name, absl::string_view column_name, absl::string_view column_type); absl::Status InvalidPrimaryKeyColumnType(absl::string_view column_name, absl::string_view type); absl::Status InvalidColumnLength(absl::string_view column_name, int64_t specified_length, int64_t min_length, int64_t max_length); absl::Status UnallowedCommitTimestampOption(absl::string_view column_name); absl::Status InvalidColumnSizeReduction(absl::string_view column_name, int64_t specified_length, int64_t existing_length, absl::string_view key); absl::Status ColumnNotNull(absl::string_view column_name, absl::string_view key); absl::Status CannotChangeColumnType(absl::string_view column_name, absl::string_view old_type, absl::string_view new_type); absl::Status AddingNotNullColumn(absl::string_view table_name, absl::string_view column_name); absl::Status InvalidDropColumnWithDependency(absl::string_view column_name, absl::string_view table_name, absl::string_view index_name); absl::Status CannotChangeKeyColumn(absl::string_view column_name, absl::string_view reason); absl::Status CannotChangeKeyColumnWithChildTables( absl::string_view column_name); absl::Status InvalidDropKeyColumn(absl::string_view colum_name, absl::string_view table_name); absl::Status TooManyTablesPerDatabase(absl::string_view table_name, int64_t limit); absl::Status CreateChangeStreamForClauseInvalidOneof( absl::string_view change_stream_name); absl::Status CreateChangeStreamForClauseZeroEntriesInTrackedTables( absl::string_view change_stream_name); absl::Status CreateChangeStreamForClauseTrackedTablesEntryMissingTableName( absl::string_view change_stream_name); absl::Status ChangeStreamDuplicateTable(absl::string_view change_stream_name, absl::string_view table_name); absl::Status InvalidTrackedObjectInChangeStream( absl::string_view change_stream_name, absl::string_view object_type, absl::string_view object_name); absl::Status UnsupportedTrackedObjectOrNonExistentTableInChangeStream( absl::string_view change_stream_name, absl::string_view table_name); absl::Status UnsupportedProcedure(absl::string_view procedure_string); absl::Status CreateChangeStreamForClauseTrackedTablesEntryInvalidOneof( absl::string_view change_stream_name); absl::Status ChangeStreamDuplicateColumn(absl::string_view change_stream_name, absl::string_view column_name, absl::string_view table_name); absl::Status NonexistentTrackedColumnInChangeStream( absl::string_view change_stream_name, absl::string_view column_name, absl::string_view table_name); absl::Status KeyColumnInChangeStreamForClause( absl::string_view change_stream_name, absl::string_view key_column_name, absl::string_view table_name); absl::Status TooManyChangeStreamsPerDatabase( absl::string_view change_stream_name, int64_t limit); absl::Status TooManyChangeStreamsTrackingSameObject( absl::string_view change_stream_name, int64_t limit, absl::string_view object_name_string); absl::Status UnsupportedChangeStreamOption(absl::string_view option_name); absl::Status InvalidChangeStreamRetentionPeriodOptionValue(); absl::Status InvalidTimeDurationFormat(absl::string_view time_duration); absl::Status InvalidTypeForVectorLength(absl::string_view column_name); absl::Status VectorLengthOnGeneratedOrDefaultColumn( absl::string_view column_name); absl::Status InvalidDataRetentionPeriod(absl::string_view time_duration); absl::Status InvalidValueCaptureType(absl::string_view value_capture_type); absl::Status AlterChangeStreamDropNonexistentForClause( absl::string_view change_stream_name); absl::Status TrackUntrackableTables(absl::string_view table_name); absl::Status TrackUntrackableColumns(absl::string_view column_name); absl::Status UnsetTrackedObject(absl::string_view change_stream_name, absl::string_view table_name); // change stream tvf query related errors absl::Status InvalidChangeStreamTvfArgumentNullStartTimestamp(); absl::Status InvalidChangeStreamTvfArgumentStartTimestampTooFarInFuture( absl::string_view min_read_ts_string, absl::string_view max_read_ts_string, absl::string_view start_ts_string); absl::Status InvalidChangeStreamTvfArgumentStartTimestampTooOld( absl::string_view min_read_ts_string, absl::string_view start_ts_string); absl::Status InvalidChangeStreamTvfArgumentStartTimestampGreaterThanEndTimestamp( absl::string_view start_ts_string, absl::string_view end_ts_string); absl::Status InvalidChangeStreamTvfArgumentNullHeartbeat(); absl::Status InvalidChangeStreamTvfArgumentOutOfRangeHeartbeat( int64_t min_heartbeat_num, int64_t max_heartbeat_num, int64_t heartbeat_num); absl::Status InvalidChangeStreamTvfArgumentNonNullReadOptions(); absl::Status InvalidChangeStreamTvfArgumentWithArgIndex( absl::string_view tvf_name_string, int index_num); absl::Status InvalidChangeStreamTvfArgumentPartitionTokenInvalidChangeStreamName( absl::string_view partition_token_string); absl::Status InvalidChangeStreamTvfArgumentStartTimestampForPartition( absl::string_view min_ts_string, absl::string_view max_ts_string, absl::string_view start_ts_string); absl::Status ChangeStreamStalePartition(); absl::Status IllegalChangeStreamQuerySyntax(absl::string_view tvf_name_string); absl::Status IllegalChangeStreamQueryPGSyntax( absl::string_view tvf_name_string); absl::Status ChangeStreamQueriesMustBeSingleUseOnly(); absl::Status ChangeStreamQueriesMustBeStrongReads(); absl::Status ChangeStreamQueriesMustBeStreaming(); absl::Status LocalityGroupNotFound(absl::string_view locality_group_name); absl::Status DroppingLocalityGroupWithAssignedTableColumn( absl::string_view locality_group_name); absl::Status CreatingDefaultLocalityGroup(); absl::Status DroppingDefaultLocalityGroup(); absl::Status InvalidLocalityGroupName(absl::string_view locality_group_name); absl::Status AlterLocalityGroupWithoutOptions(); absl::Status TooManyIndicesPerDatabase(absl::string_view index_name, int64_t limit); absl::Status TooManyColumns(absl::string_view object_type, absl::string_view object_name, int64_t limit); absl::Status TooManyKeys(absl::string_view object_type, absl::string_view object_name, int64_t key_count, int64_t limit); absl::Status NoColumnsTable(absl::string_view object_type, absl::string_view object_name); absl::Status TooManyIndicesPerTable(absl::string_view index_name, absl::string_view table_name, int64_t limit); absl::Status DeepNesting(absl::string_view object_type, absl::string_view object_name, int limit); absl::Status DropTableWithInterleavedTables(absl::string_view table_name, absl::string_view child_tables); absl::Status DropTableWithDependentIndices(absl::string_view table_name, absl::string_view indexes); absl::Status DropTableWithDependentChangeStreams( absl::string_view table_name, absl::string_view change_streams); absl::Status SetOnDeleteWithoutInterleaving(absl::string_view table_name); absl::Status NonExistentKeyColumn(absl::string_view object_type, absl::string_view object_name, absl::string_view key_column); absl::Status DuplicateColumnName(absl::string_view column_name); absl::Status MultipleRefsToKeyColumn(absl::string_view object_type, absl::string_view object_name, absl::string_view key_column); absl::Status IncorrectParentKeyPosition(absl::string_view child_object_type, absl::string_view child_object_name, absl::string_view parent_key_column, int position); absl::Status MustReferenceParentKeyColumn(absl::string_view child_object_type, absl::string_view child_object_name, absl::string_view parent_key_column); absl::Status IncorrectParentKeyOrder(absl::string_view child_object_type, absl::string_view child_object_name, absl::string_view parent_key_column, absl::string_view child_key_order); absl::Status IncorrectParentKeyType(absl::string_view child_object_type, absl::string_view child_object_name, absl::string_view parent_key_column, absl::string_view child_key_type, absl::string_view parent_key_type); absl::Status IncorrectParentKeyLength(absl::string_view child_object_type, absl::string_view child_object_name, absl::string_view parent_key_column, absl::string_view child_key_length, absl::string_view parent_key_length); absl::Status IncorrectParentKeyNullability(absl::string_view child_object_type, absl::string_view child_object_name, absl::string_view parent_key_column, absl::string_view parent_nullability, absl::string_view child_nullability); absl::Status IndexWithNoKeys(absl::string_view index_name); absl::Status IndexRefsKeyAsStoredColumn(absl::string_view index_name, absl::string_view column_name); absl::Status IndexRefsColumnTwice(absl::string_view index_name, absl::string_view key_column); absl::Status IndexInterleaveTableNotFound(absl::string_view index_name, absl::string_view table_name); absl::Status IndexRefsUnsupportedColumn(absl::string_view index_name, absl::string_view type); absl::Status IndexInterleaveTableUnacceptable(absl::string_view index_name, absl::string_view indexed_table, absl::string_view parent_table); absl::Status IndexRefsTableKeyAsStoredColumn(absl::string_view index_name, absl::string_view stored_column, absl::string_view base_table); absl::Status IndexRefsNonExistentColumn(absl::string_view index_name, absl::string_view column_name); absl::Status AlteringParentColumn(absl::string_view column_name); absl::Status ChangingNullConstraintOnIndexedColumn( absl::string_view column_name, absl::string_view index_name); absl::Status ConcurrentSchemaChangeOrReadWriteTxnInProgress(); // Model errors. absl::Status TooManyModelsPerDatabase(absl::string_view model_name, int64_t limit); absl::Status ModelAlreadyExists(absl::string_view model_name); absl::Status TooManyModelColumns(absl::string_view model_name, absl::string_view column_kind, int64_t limit); absl::Status NoColumnsModel(absl::string_view model_name, absl::string_view column_kind); absl::Status LocalModelUnsupported(absl::string_view model_name); absl::Status NoModelEndpoint(absl::string_view model_name); absl::Status AmbiguousModelEndpoint(absl::string_view model_name); absl::Status InvalidModelDefaultBatchSize(absl::string_view model_name, int64_t value, int64_t limit); absl::Status ModelDuplicateColumn(absl::string_view column_name); absl::Status ModelCaseInsensitiveDuplicateColumn( absl::string_view column_name, absl::string_view original_column_name); absl::Status MlInputColumnMissing(absl::string_view column_name, absl::string_view column_type); absl::Status MlInputColumnAmbiguous(absl::string_view column_name); absl::Status MlInputColumnTypeMismatch(absl::string_view column_name, absl::string_view input_column_type, absl::string_view model_column_type); absl::Status MlPassThroughColumnAmbiguous(absl::string_view column_name); absl::Status MlPredictRow_Argument_Null(absl::string_view arg_name); absl::Status MlPredictRow_Argument_NotObject(absl::string_view arg_name); absl::Status MlPredictRow_Argument_UnexpectedValueType( absl::string_view arg_name, absl::string_view key, absl::string_view type); absl::Status MlPredictRow_Argument_UnexpectedKey(absl::string_view arg_name, absl::string_view key); absl::Status MlPredictRow_ModelEndpoint_NoEndpoints(); absl::Status MlPredictRow_ModelEndpoint_EndpointsAmbiguous(); absl::Status MlPredictRow_ModelEndpoint_InvalidBatchSize(int64_t value_num, int64_t min_num, int64_t max_num); absl::Status MlPredictRow_Args_NoInstances(); absl::Status EmptyStruct(); absl::Status StructFieldNumberExceedsLimit(int64_t limit); absl::Status MissingStructFieldName(absl::string_view struct_type); absl::Status DuplicateStructName(absl::string_view struct_type, absl::string_view field_name); absl::Status CaseInsensitiveDuplicateStructName( absl::string_view struct_type, absl::string_view field_name, absl::string_view existing_field_name); absl::Status CaseInsensitiveDuplicateStructName( absl::string_view struct_type, absl::string_view field_name, absl::string_view existing_field_name); absl::Status ModelColumnTypeUnsupported(absl::string_view model_name, absl::string_view column_name, absl::string_view column_type); absl::Status ModelColumnNotNull(absl::string_view model_name, absl::string_view column_name); absl::Status ModelColumnHidden(absl::string_view model_name, absl::string_view column_name); absl::Status ModelColumnLength(absl::string_view model_name, absl::string_view column_name); absl::Status ModelColumnGenerated(absl::string_view model_name, absl::string_view column_name); absl::Status ModelColumnDefault(absl::string_view model_name, absl::string_view column_name); // Property graph errors. absl::Status TooManyPropertyGraphsPerDatabase(absl::string_view graph_name, int64_t limit); absl::Status PropertyGraphNotFound(absl::string_view property_graph_name); absl::Status PropertyGraphDuplicateLabel(absl::string_view property_graph_name, std::string_view label_name); absl::Status PropertyGraphDuplicatePropertyDeclaration( absl::string_view property_graph_name, absl::string_view property_declaration_name); absl::Status GraphElementTableLabelNotFound( absl::string_view property_graph_name, absl::string_view element_table_name, absl::string_view label_name); absl::Status GraphElementTablePropertyDefinitionNotFound( absl::string_view property_graph_name, absl::string_view element_table_name, absl::string_view property_definition_name); absl::Status GraphEdgeTableSourceNodeTableNotFound( absl::string_view property_graph_name, absl::string_view edge_table_name, absl::string_view node_table_name); absl::Status GraphEdgeTableDestinationNodeTableNotFound( absl::string_view property_graph_name, absl::string_view edge_table_name, absl::string_view node_table_name); // Schema access errors. absl::Status TableNotFound(absl::string_view table_name); absl::Status TableNotFoundAtTimestamp(absl::string_view table_name, absl::Time timestamp); absl::Status IndexNotFound(absl::string_view index_name); absl::Status ChangeStreamNotFound(absl::string_view change_stream_name); absl::Status UnknownPlacement(absl::string_view placement_name); absl::Status PlacementNotFound(absl::string_view placement_name); absl::Status ModelNotFound(absl::string_view model_name); absl::Status TableValuedFunctionNotFound(absl::string_view tvf_name); absl::Status SequenceNotFound(absl::string_view sequence_name); absl::Status TypeNotFound(absl::string_view type_name); absl::Status DropTableWithChangeStream( absl::string_view table_name, int64_t change_stream_count, absl::string_view change_stream_name_list_string); absl::Status DropColumnWithChangeStream( absl::string_view table_name, absl::string_view column_name, int64_t change_stream_count, absl::string_view change_stream_name_list_string); absl::Status DropForeignKeyManagedIndex(absl::string_view index_name, absl::string_view foreign_key_names); absl::Status ColumnNotFound(absl::string_view table_name, absl::string_view column_name); absl::Status ColumnNotFoundAtTimestamp(absl::string_view table_name, absl::string_view column_name, absl::Time timestamp); absl::Status ColumnValueTypeMismatch(absl::string_view table_name, absl::string_view column_type, absl::string_view value_type); absl::Status CannotParseKeyValue(absl::string_view table_name, absl::string_view column, absl::string_view column_type); absl::Status MutationColumnAndValueSizeMismatch(int columns_size, int values_size); absl::Status SchemaObjectAlreadyExists(absl::string_view schema_object, absl::string_view name); absl::Status ConstraintNotFound(absl::string_view constraint_name, absl::string_view table_name); // Commit timestamp errors. absl::Status CommitTimestampInFuture(absl::Time timestamp); absl::Status CannotReadPendingCommitTimestamp(absl::string_view entity_string); absl::Status CommitTimestampNotInFuture(absl::string_view column, absl::string_view key, absl::Time timestamp); absl::Status PendingCommitTimestampAllOrNone(int64_t index_num); absl::Status CommitTimestampOptionNotEnabled(absl::string_view column_name); // Time errors. absl::Status InvalidTime(absl::string_view msg); // Read argument errors. absl::Status StalenessMustBeNonNegative(); absl::Status InvalidMinReadTimestamp(absl::Time min_read_timestamp); absl::Status InvalidExactReadTimestamp(absl::Time exact_read_timestamp); absl::Status StrongReadOptionShouldBeTrue(); absl::Status InvalidReadLimit(); absl::Status InvalidReadLimitWithPartitionToken(); // Constraint errors. absl::Status RowAlreadyExists(absl::string_view table_name, absl::string_view key); absl::Status RowNotFound(absl::string_view table_name, absl::string_view key); absl::Status ParentKeyNotFound(absl::string_view parent_table_name, absl::string_view child_table_name, absl::string_view key); absl::Status ChildKeyExists(absl::string_view parent_table_name, absl::string_view child_table_name, absl::string_view key); absl::Status NullValueForNotNullColumn(absl::string_view table_name, absl::string_view column_name); absl::Status NullValueForNotNullColumn(absl::string_view table_name, absl::string_view column_name, absl::string_view key); absl::Status InvalidColumnLength(absl::string_view table_name, absl::string_view column_name, int max_column_length); absl::Status InvalidStringEncoding(absl::string_view table_name, absl::string_view column_name); absl::Status UTF8StringColumn(absl::string_view column_name, absl::string_view key); absl::Status ValueExceedsLimit(absl::string_view column_name, int value_size, int max_column_size); absl::Status NonNullValueNotSpecifiedForInsert(absl::string_view table_name, absl::string_view column_name); absl::Status KeyTooLarge(absl::string_view table_name, int64_t key_size, int64_t max_key_size); absl::Status IndexKeyTooLarge(absl::string_view index_name, int64_t key_size, int64_t max_key_size); // Index errors. absl::Status UniqueIndexConstraintViolation(absl::string_view index_name, absl::string_view key); absl::Status UniqueIndexViolationOnIndexCreation(absl::string_view index_name, absl::string_view key); absl::Status IndexTableDoesNotMatchBaseTable(absl::string_view base_table, absl::string_view indexed_table, absl::string_view index); absl::Status IndexNotFound(absl::string_view index, absl::string_view table); absl::Status ColumnNotFoundInIndex(absl::string_view index, absl::string_view indexed_table, absl::string_view column); absl::Status ColumnNotFoundInIndex(absl::string_view index_name, absl::string_view column_name); absl::Status ColumnInIndexAlreadyExists(absl::string_view index_name, absl::string_view column_name); absl::Status IndexInDifferentSchema(absl::string_view index_name, absl::string_view indexed_table_name); // Foreign key errors. absl::Status ForeignKeyColumnsRequired(absl::string_view table, absl::string_view foreign_key); absl::Status ForeignKeyColumnCountMismatch(absl::string_view referencing_table, absl::string_view referenced_table, absl::string_view foreign_key); absl::Status ForeignKeyDuplicateColumn(absl::string_view column, absl::string_view table, absl::string_view foreign_key); absl::Status ForeignKeyColumnNotFound(absl::string_view column, absl::string_view table, absl::string_view foreign_key); absl::Status ForeignKeyColumnTypeUnsupported(absl::string_view column, absl::string_view table, absl::string_view foreign_key); absl::Status ForeignKeyCommitTimestampColumnUnsupported( absl::string_view column, absl::string_view table, absl::string_view foreign_key); absl::Status ForeignKeyColumnTypeMismatch(absl::string_view referencing_column, absl::string_view referencing_table, absl::string_view referenced_column, absl::string_view referenced_table, absl::string_view foreign_key); absl::Status ForeignKeyReferencedTableDropNotAllowed( absl::string_view table, absl::string_view foreign_keys); absl::Status ForeignKeyColumnDropNotAllowed(absl::string_view column, absl::string_view table, absl::string_view foreign_keys); absl::Status ForeignKeyColumnNullabilityChangeNotAllowed( absl::string_view column, absl::string_view table, absl::string_view foreign_keys); absl::Status ForeignKeyColumnTypeChangeNotAllowed( absl::string_view column, absl::string_view table, absl::string_view foreign_keys); absl::Status ForeignKeyColumnSetCommitTimestampOptionNotAllowed( absl::string_view column, absl::string_view table, absl::string_view foreign_keys); absl::Status ForeignKeyReferencedKeyNotFound( absl::string_view foreign_key, absl::string_view referencing_table, absl::string_view referenced_table, absl::string_view referenced_key); absl::Status ForeignKeyReferencingKeyFound(absl::string_view foreign_key, absl::string_view referencing_table, absl::string_view referenced_table, absl::string_view referencing_key); absl::Status ForeignKeyOnDeleteActionUnsupported( absl::string_view referential_action); absl::Status ForeignKeyEnforcementUnsupported(); absl::Status NumericTypeNotEnabled(); absl::Status JsonTypeNotEnabled(); // Check constraint errors absl::Status CheckConstraintNotEnabled(); absl::Status CheckConstraintViolated(absl::string_view check_constraint_name, absl::string_view table_name, absl::string_view key_debug_string); absl::Status CheckConstraintExpressionParseError( absl::string_view table_name, absl::string_view check_constraint_expression, absl::string_view check_constraint_name, absl::string_view message); absl::Status CheckConstraintNotUsingAnyNonGeneratedColumn( absl::string_view table_name, absl::string_view check_constraint_name, absl::string_view expression); absl::Status CannotUseCommitTimestampColumnOnCheckConstraint( absl::string_view column_name); absl::Status InvalidDropDependentCheckConstraint( absl::string_view type_kind, absl::string_view dependency_name, absl::string_view dependent_check_constraint_name); absl::Status CannotAlterColumnDataTypeWithDependentCheckConstraint( absl::string_view column_name, absl::string_view check_constraint_name); absl::Status DependentCheckConstraintBecomesInvalid( absl::string_view modify_action, absl::string_view dependency_name, absl::string_view dependent_check_constraint, absl::string_view error); // Generated column errors absl::Status GeneratedColumnsNotEnabled(); absl::Status GeneratedColumnDefinitionParseError(absl::string_view table_name, absl::string_view column_name, absl::string_view message); absl::Status NonScalarExpressionInColumnExpression(absl::string_view type); absl::Status ColumnExpressionMaxDepthExceeded(int depth, int max_depth); absl::Status InvalidDropColumnReferencedByGeneratedColumn( absl::string_view column_name, absl::string_view table_name, absl::string_view referencing_column_name); absl::Status CannotConvertGeneratedColumnToRegularColumn( absl::string_view table_name, absl::string_view column_name); absl::Status CannotConvertRegularColumnToGeneratedColumn( absl::string_view table_name, absl::string_view column_name); absl::Status CannotAlterStoredGeneratedColumnDataType( absl::string_view table_name, absl::string_view column_name); absl::Status CannotAlterGeneratedColumnExpression( absl::string_view table_name, absl::string_view column_name); absl::Status CannotAlterColumnDataTypeWithDependentStoredGeneratedColumn( absl::string_view column_name); absl::Status CannotAlterGeneratedColumnStoredAttribute( absl::string_view table_name, absl::string_view column_name); absl::Status CannotUseCommitTimestampOnGeneratedColumnDependency( absl::string_view column_name); absl::Status CannotUseGeneratedColumnInPrimaryKey( absl::string_view table_name, absl::string_view column_name); absl::Status CannotWriteToGeneratedColumn(absl::string_view table_name, absl::string_view column_name); absl::Status NonDeterministicFunctionInColumnExpression( absl::string_view function_name, absl::string_view expression_use); absl::Status InvalidDropDependentColumn(absl::string_view type_kind, absl::string_view dependency_name, absl::string_view dependent_column); absl::Status DependentColumnBecomesInvalid(absl::string_view modify_action, absl::string_view dependency_name, absl::string_view dependent_column, absl::string_view error); // Column default values errors. absl::Status ColumnDefaultValuesNotEnabled(); absl::Status DefaultExpressionWithColumnDependency( absl::string_view column_name); absl::Status ColumnDefaultValueParseError(absl::string_view table_name, absl::string_view column_name, absl::string_view message); absl::Status CannotUseCommitTimestampWithColumnDefaultValue( absl::string_view column_name); absl::Status DefaultPKNeedsExplicitValue(absl::string_view column_name, absl::string_view op_name); absl::Status GeneratedPKNeedsExplicitValue(absl::string_view column_name); absl::Status GeneratedPkModified(absl::string_view column_name); absl::Status UserSuppliedValueInNonUpdateGpk(absl::string_view column_name); absl::Status NeedAllDependentColumnsForGpk(absl::string_view column_name); absl::Status CannotSetDefaultValueOnGeneratedColumn( absl::string_view column_name); // Query errors. absl::Status InvalidHint(absl::string_view hint_string); absl::Status InvalidEmulatorHint(absl::string_view hint_string); absl::Status InvalidHintValue(absl::string_view hint_string, absl::string_view value_string); absl::Status InvalidEmulatorHintValue(absl::string_view hint_string, absl::string_view value_string); absl::Status QueryHintIndexNotFound(absl::string_view table_name, absl::string_view index_name); absl::Status QueryHintManagedIndexNotSupported(absl::string_view index_name); absl::Status NullFilteredIndexUnusable(absl::string_view index_name); absl::Status NonPartitionableQuery(absl::string_view reason); absl::Status EmulatorDoesNotSupportQueryPlans(); absl::Status InvalidStatementHintValue(absl::string_view hint_string, absl::string_view hint_value); absl::Status MultipleValuesForSameHint(absl::string_view hint_string); absl::Status InvalidHintForNode(absl::string_view hint_string, absl::string_view supported_node); absl::Status InvalidBatchDmlRequest(); absl::Status BatchDmlOnlySupportsReadWriteTransaction(); absl::Status ExecuteBatchDmlOnlySupportsDmlStatements(int index, absl::string_view query); absl::Status ReadOnlyTransactionDoesNotSupportDml( absl::string_view transaction_type); absl::Status ReadOnlyTransactionDoesNotSupportReadWriteOnlyFunctions( absl::string_view functions); absl::Status CannotInsertDuplicateKeyInsertOrUpdateDml(absl::string_view key); // Unsupported query shape errors. absl::Status UnsupportedReturnStructAsColumn(); absl::Status UnsupportedArrayConstructorSyntaxForEmptyStructArray(); absl::Status UnsupportedFeatureSafe(absl::string_view feature_type, absl::string_view info_message); absl::Status UnsupportedFunction(absl::string_view function_name); absl::Status UnsupportedHavingModifierWithDistinct(); absl::Status UnsupportedIgnoreNullsInAggregateFunctions(); absl::Status NullifStructNotSupported(); absl::Status ComparisonNotSupported(int arg_num, absl::string_view function_name); absl::Status StructComparisonNotSupported(absl::string_view function_name); absl::Status PendingCommitTimestampDmlValueOnly(); absl::Status UnsupportedUpsertQueries(absl::string_view insert_mode); absl::Status UnsupportedReturningWithUpsertQueries( absl::string_view insert_mode); absl::Status UnsupportedGeneratedKeyWithUpsertQueries(); absl::Status NoFeatureSupportDifferentTypeArrayCasts( absl::string_view from_type, absl::string_view to_type); absl::Status UnsupportedTablesampleRepeatable(); absl::Status UnsupportedTablesampleSystem(); absl::Status ToJsonStringNonJsonTypeNotSupported(absl::string_view type_name); absl::Status NoMatchingFunctionSignature(absl::string_view function_name, absl::string_view supported_signature); // Query size limits errors. absl::Status TooManyFunctions(int max_function_nodes); absl::Status TooManyNestedBooleanPredicates(int max_nested_function_nodes); absl::Status TooManyJoins(int max_Joins); absl::Status TooManyNestedSubqueries(int max_nested_subquery_expressions); absl::Status TooManyNestedSubselects(int max_nested_subselects); absl::Status TooManyNestedAggregates(int max_nested_group_by); absl::Status TooManyParameters(int max_parameters); absl::Status TooManyElementsInInList(int max_elements_in_in_list); absl::Status TooManyAggregates(int max_columns_in_group_by); absl::Status TooManyUnions(int max_unions_in_query); absl::Status TooManySubqueryChildren(int max_subquery_expression_children); absl::Status TooManyStructFields(int max_struct_fields); absl::Status TooManyNestedStructs(int max_nested_struct_depth); absl::Status QueryStringTooLong(int query_length, int max_length); // Partition Read errors. absl::Status InvalidBytesPerBatch(absl::string_view message_name); absl::Status InvalidMaxPartitionCount(absl::string_view message_name); absl::Status InvalidPartitionToken(); absl::Status ReadFromDifferentSession(); absl::Status ReadFromDifferentTransaction(); absl::Status ReadFromDifferentParameters(); absl::Status InvalidPartitionedQueryMode(); // Row Deletion Policy errors. absl::Status RowDeletionPolicyDoesNotExist(absl::string_view table_name); absl::Status RowDeletionPolicyAlreadyExists(absl::string_view column_name, absl::string_view table_name); absl::Status RowDeletionPolicyOnColumnDoesNotExist( absl::string_view column_name, absl::string_view table_name); absl::Status RowDeletionPolicyOnNonTimestampColumn( absl::string_view column_name, absl::string_view table_name); absl::Status RowDeletionPolicyWillBreak(absl::string_view column_name, absl::string_view table_name); absl::Status RowDeletionPolicyHasChildWithOnDeleteNoAction( absl::string_view table_name, absl::string_view child_table_name); absl::Status RowDeletionPolicyOnAncestors( absl::string_view table_name, absl::string_view ancestor_table_name); absl::Status ForeignKeyRowDeletionPolicyAddNotAllowed( absl::string_view table_name, absl::string_view foreign_keys); // Table synonym errors. absl::Status SynonymDoesNotExist(absl::string_view synonym, absl::string_view table_name); absl::Status SynonymAlreadyExists(absl::string_view synonym, absl::string_view table_name); absl::Status CannotAlterSynonym(absl::string_view synonym, absl::string_view table_name); // Proto / enum type errors. absl::Status ProtoTypeNotFound(absl::string_view type); absl::Status ProtoEnumTypeNotFound(absl::string_view type); absl::Status UnrecognizedColumnType(absl::string_view column_name, absl::string_view type); absl::Status InvalidEnumValue(absl::string_view column_name, int64_t int_value, absl::string_view column_type, absl::string_view key); absl::Status ExtensionNotSupported(int tag_number, absl::string_view field_name); absl::Status MessageExtensionsNotSupported(absl::string_view message_name); absl::Status MessageTypeNotSupported(absl::string_view message_name); absl::Status NonHiddenTokenlistColumn(absl::string_view table_name, absl::string_view column_name); // create search index errors absl::Status SearchIndexNotPartitionByokenListType( absl::string_view index_name, absl::string_view column_name); absl::Status SearchIndexSortMustBeNotNullError(absl::string_view column_name, absl::string_view index_name); absl::Status SearchIndexOrderByMustBeIntegerType(absl::string_view index_name, absl::string_view column_name, absl::string_view column_type); absl::Status ProjectTokenlistNotAllowed(); absl::Status TokenlistTypeMergeConflict(); absl::Status SearchIndexNotUsable(absl::string_view index_name, absl::string_view reason); absl::Status SearchIndexTokenlistKeyOrderUnsupported( absl::string_view column_name, absl::string_view index_name); // create vector index errors absl::Status VectorIndexPartitionByUnsupported(absl::string_view index_name); absl::Status VectorIndexNonArrayKey(absl::string_view column_string, absl::string_view index_string); absl::Status VectorIndexArrayKeyMustBeFloatOrDouble( absl::string_view column_string, absl::string_view index_string); absl::Status VectorIndexArrayKeyMustHaveVectorLength( absl::string_view column_string, absl::string_view index_string); absl::Status VectorIndexArrayKeyVectorLengthTooLarge( absl::string_view column_string, absl::string_view index_string, int64_t actual_len_num, int64_t max_len_num); absl::Status VectorIndexKeyNotNullFiltered(absl::string_view column_string, absl::string_view index_string); // alter vector index errors absl::Status AlterVectorIndexStoredColumnUnsupported(); absl::Status AlterVectorIndexSetOptionsUnsupported(); absl::Status VectorIndexStoredColumnNotFound(absl::string_view index_name, absl::string_view column_name); absl::Status VectorIndexStoredColumnAlreadyExists( absl::string_view index_name, absl::string_view column_name); absl::Status VectorIndexStoredColumnIsKey(absl::string_view index_name, absl::string_view column_name, absl::string_view table_name); absl::Status VectorIndexStoredColumnAlreadyPrimaryKey( absl::string_view index_name, absl::string_view column_name); absl::Status VectorIndexNotStoredColumn(absl::string_view index_name, absl::string_view column_name); absl::Status FpAlgorithmOnlySupportedOnFloats(); absl::Status NumericIndexingUnsupportedComparisonType( absl::string_view function_name, absl::string_view comparison_type); absl::Status NumericIndexingUnsupportedAlgorithm( absl::string_view function_name, absl::string_view algorithm); absl::Status NumericIndexingVariableMustBeFinite( absl::string_view var_name, absl::string_view value_string); absl::Status NumericIndexingMinMustBeLessThanMax( absl::string_view function_name, absl::string_view min_string, absl::string_view max_string); absl::Status NumericIndexingGranularityMustBeFiniteAndPositive( absl::string_view value_string); absl::Status NumericIndexingGranularityMustBeLessThanDiffBetweenMinAndMax( absl::string_view granularity_string, absl::string_view min_string, absl::string_view max_string); absl::Status NumericIndexingGranularityTooSmallForRange( absl::string_view min_allowed_granularity_string, absl::string_view granularity_string); absl::Status NumericIndexingTreeBaseNotInRange(absl::string_view tree_base); absl::Status NumericIndexingPrecisionNotInRange( absl::string_view precision_num); absl::Status InvalidRelativeSearchType(absl::string_view relative_search_type); absl::Status SearchSubstringSupportRelativeSearchTypeArgConflict(); absl::Status RelativeSearchNotSupported(absl::string_view relative_search_type); // Search function errors absl::Status InvalidUseOfSearchRelatedFunctionWithReason( absl::string_view reason); absl::Status TokenListNotMatchSearch(absl::string_view function_name, absl::string_view tokenizer_name); absl::Status ColumnNotSearchable(absl::string_view column_type); absl::Status InvalidQueryType(absl::string_view query_type); absl::Status FailToParseSearchQuery(absl::string_view query, absl::string_view errors); absl::Status InvalidNgramSize(absl::string_view error); absl::Status IncorrectSnippetColumnType(absl::string_view column_type); absl::Status InvalidSnippetQueryType(absl::string_view query_type); absl::Status InvalidContentType(absl::string_view function_name, absl::string_view content_type, absl::string_view valid_types); absl::Status InvalidUseOfSnippetArgs(absl::string_view arg_name); // Vector length errors absl::Status VectorLengthExceedsLimit(absl::string_view column_name, int element_num, int limit); absl::Status VectorLengthLessThanLimit(absl::string_view column_name, int element_num, int limit); absl::Status DisallowNullsInSearchArray(absl::string_view column_name); absl::Status CannotAlterColumnToAddVectorLength(absl::string_view column_name); absl::Status CannotAlterColumnToRemoveVectorLength( absl::string_view column_name); // Proto / enum type errors. absl::Status ProtoTypeNotFound(absl::string_view type); absl::Status ProtoEnumTypeNotFound(absl::string_view type); absl::Status DeletedTypeStillInUse(absl::string_view type_name, absl::string_view column_name); absl::Status RestrictedPackagesCantBeUsed(absl::string_view type_name, absl::string_view package_name); // Views errors. absl::Status ViewsNotSupported(absl::string_view view_op_name); absl::Status TooManyViewsPerDatabase(absl::string_view function_name, int limit); absl::Status ViewBodyAnalysisError(absl::string_view view_name, absl::string_view error); absl::Status ViewNotFound(absl::string_view view_name); absl::Status ViewRequiresInvokerSecurity(absl::string_view view_name); absl::Status ViewReplaceError(absl::string_view view_name, absl::string_view error); absl::Status ViewReplaceRecursive(absl::string_view view_name); absl::Status DependentViewBecomesInvalid(absl::string_view modify_action, absl::string_view dependency_name, absl::string_view dependent_view_name, absl::string_view error); absl::Status DependentViewColumnRename(absl::string_view modify_action, absl::string_view view_name, absl::string_view dependent_view, absl::string_view old_column_name, absl::string_view new_column_name); absl::Status DependentViewColumnRetype(absl::string_view modify_action, absl::string_view view_name, absl::string_view dependent_view, absl::string_view old_type, absl::string_view new_type); absl::Status InvalidDropDependentViews(absl::string_view type_kind, absl::string_view name, absl::string_view dependent_views); absl::Status WithViewsAreNotSupported(); // Function errors. absl::Status FunctionRequiresInvokerSecurity(absl::string_view function_name); absl::Status FunctionReplaceError(absl::string_view function_name, absl::string_view error); absl::Status FunctionBodyAnalysisError(absl::string_view function_name, absl::string_view error); absl::Status ReplacingBuiltInFunction(absl::string_view operation_string, absl::string_view type_kind, absl::string_view built_in_name); absl::Status FunctionTypeMismatch(absl::string_view function_name, absl::string_view expected_type, absl::string_view actual_type); absl::Status DependentFunctionBecomesInvalid( absl::string_view modify_action, absl::string_view dependency_name, absl::string_view depedent_function_name, absl::string_view error); // TODO Create a singular function that takes a list of dependent // schema nodes to use for all schema nodes. absl::Status InvalidDropDependentFunction(absl::string_view type_kind, absl::string_view dependency_name, absl::string_view dependent_function); absl::Status FunctionNotFound(absl::string_view function_name); // Sequence-related errors absl::Status SequenceNotSupportedInPostgreSQL(); absl::Status UnsupportedSequenceOption(absl::string_view option_name); absl::Status InvalidSequenceOptionValue(absl::string_view option_name, absl::string_view type); absl::Status InvalidSequenceStartWithCounterValue(); absl::Status SequenceSkipRangeMinMaxNotSetTogether(); absl::Status SequenceSkippedRangeHasAtleastOnePositiveNumber(); absl::Status SequenceSkipRangeMinLargerThanMax(); absl::Status UnsupportedSequenceKind(absl::string_view kind); absl::Status SequenceNeedsAccessToSchema(); absl::Status SequenceExhausted(absl::string_view name); // AlterDatabase related errors absl::Status UnsupportedAlterDatabaseOption(absl::string_view option_name); absl::Status NullValueAlterDatabaseOption(); // Named Schema-related errors absl::Status NamedSchemaNotFound(absl::string_view named_schema_name); absl::Status AlterNamedSchemaNotSupported(); absl::Status DropNamedSchemaHasDependencies( absl::string_view named_schema_name, const std::vector<std::string>& tables, const std::vector<std::string>& views, const std::vector<std::string>& indexes, const std::vector<std::string>& sequences); absl::Status UnsupportedVersionRetentionPeriodOptionValues(); // Identity column-related errors absl::Status ColumnIsNotIdentityColumn(absl::string_view table_name, absl::string_view column_name); absl::Status DefaultSequenceKindAlreadySet(); absl::Status UnsupportedDefaultSequenceKindOptionValues(); absl::Status UnspecifiedIdentityColumnSequenceKind( absl::string_view column_name); absl::Status ChangeDefaultTimeZoneOnNonEmptyDatabase(); absl::Status UnsupportedDefaultTimeZoneOptionValues(); absl::Status InvalidDefaultTimeZoneOption(absl::string_view time_zone); absl::Status InvalidColumnIdentifierFormat( absl::string_view column_path_string); absl::Status TableNotFoundInIdentityFunction(absl::string_view table_string); absl::Status ColumnNotFoundInIdentityFunction(absl::string_view table_string, absl::string_view column_string); absl::Status UnspecifiedSequenceKind(); absl::Status CannotSetSequenceClauseAndOptionTogether( absl::string_view sequence_string); absl::Status CannotAlterToIdentityColumn(absl::string_view table_string, absl::string_view column_string); absl::Status CannotAlterColumnToDropIdentity(absl::string_view table_string, absl::string_view column_string); absl::Status CannotAlterIdentityColumnToGeneratedOrDefaultColumn( absl::string_view table_string, absl::string_view column_string); absl::Status OptionsError(absl::string_view error_string); // FOR UPDATE-related errors absl::Status ForUpdateUnsupportedInReadOnlyTransactions(); absl::Status ForUpdateUnsupportedInSearchQueries(); absl::Status ForUpdateCannotCombineWithLockScannedRanges(); // Repeatable read related errors absl::Status RepeatableReadOnlySupportedInReadWriteTransactions(); absl::Status ReadLockModeInRepeatableReadMustBeUnspecified(); absl::Status ApproxDistanceFunctionOptionsRequired( absl::string_view function_string); absl::Status ApproxDistanceFunctionOptionMustBeLiteral( absl::string_view function_string); absl::Status ApproxDistanceFunctionInvalidJsonOption( absl::string_view function_string); absl::Status ApproxDistanceInvalidShape(absl::string_view function_string); absl::Status ApproxDistanceLengthMismatch(absl::string_view function_string, int input_length, int index_length); absl::Status VectorIndexesUnusable(absl::string_view distance_type_name, absl::string_view ann_func_column_name, absl::string_view ann_func_name); absl::Status VectorIndexesUnusableNotNullFiltered( absl::string_view index_string, absl::string_view column_string); absl::Status VectorIndexesUnusableForceIndexWrongDistanceType( absl::string_view index_string, absl::string_view distance_type_name, absl::string_view ann_func_name, absl::string_view column_string); absl::Status VectorIndexesUnusableForceIndexWrongColumn( absl::string_view index_string, absl::string_view ann_func_name, absl::string_view column_string); absl::Status NotVectorIndexes(absl::string_view index_string); } // namespace error } // namespace emulator } // namespace spanner } // namespace google #endif // THIRD_PARTY_CLOUD_SPANNER_EMULATOR_COMMON_ERRORS_H_