in backend/schema/validators/model_validator.cc [115:181]
absl::Status ModelValidator::Validate(const Model* model,
SchemaValidationContext* context) {
ZETASQL_RET_CHECK(!model->name_.empty());
ZETASQL_RETURN_IF_ERROR(GlobalSchemaNames::ValidateSchemaName("Model", model->name_));
if (!model->is_remote()) {
return error::LocalModelUnsupported(model->Name());
}
if (model->input_.empty()) {
return error::NoColumnsModel(model->Name(), "Input");
}
if (model->input_.size() > limits::kMaxColumnsPerTable) {
return error::TooManyModelColumns(model->Name(), "Inputs",
limits::kMaxColumnsPerTable);
}
CaseInsensitiveStringSet unique_column_names;
for (const Model::ModelColumn& column : model->input()) {
ZETASQL_RETURN_IF_ERROR(ValidateModelColumn(model, column));
if (auto i = unique_column_names.insert(column.name); !i.second) {
if (column.name != *i.first) {
return error::ModelCaseInsensitiveDuplicateColumn(
absl::StrCat(model->Name(), ".", column.name),
absl::StrCat(model->Name(), ".", *i.first));
}
return error::ModelDuplicateColumn(
absl::StrCat(model->Name(), ".", column.name));
}
}
if (model->output_.empty()) {
return error::NoColumnsModel(model->Name(), "Output");
}
if (model->output_.size() > limits::kMaxColumnsPerTable) {
return error::TooManyModelColumns(model->Name(), "Outputs",
limits::kMaxColumnsPerTable);
}
for (const Model::ModelColumn& column : model->output_) {
ZETASQL_RETURN_IF_ERROR(ValidateModelColumn(model, column));
if (auto i = unique_column_names.insert(column.name); !i.second) {
if (column.name != *i.first) {
return error::ModelCaseInsensitiveDuplicateColumn(
absl::StrCat(model->Name(), ".", column.name),
absl::StrCat(model->Name(), ".", *i.first));
}
return error::ModelDuplicateColumn(
absl::StrCat(model->Name(), ".", column.name));
}
}
if (!model->endpoint_.has_value() && model->endpoints_.empty()) {
return error::NoModelEndpoint(model->Name());
}
if (model->endpoint_.has_value() && !model->endpoints_.empty()) {
return error::AmbiguousModelEndpoint(model->Name());
}
if (model->default_batch_size_.has_value()) {
if (*model->default_batch_size_ <= 0 ||
*model->default_batch_size_ > limits::kMaxModelDefaultBatchSize) {
return error::InvalidModelDefaultBatchSize(
model->Name(), *model->default_batch_size_,
limits::kMaxModelDefaultBatchSize);
}
}
return absl::OkStatus();
}