in backend/schema/updater/ddl_type_conversion.cc [38:148]
absl::StatusOr<const zetasql::Type*> DDLColumnTypeToGoogleSqlType(
const ddl::TypeDefinition& ddl_type_def,
zetasql::TypeFactory* type_factory
,
const ProtoBundle* proto_bundle
) {
ZETASQL_RET_CHECK(ddl_type_def.has_type())
<< "No type field specification in "
<< "ddl::TypeDefinition input: " << ddl_type_def.ShortDebugString();
switch (ddl_type_def.type()) {
case ddl::TypeDefinition::FLOAT:
return type_factory->get_float();
case ddl::TypeDefinition::DOUBLE:
return type_factory->get_double();
case ddl::TypeDefinition::INT64:
return type_factory->get_int64();
case ddl::TypeDefinition::BOOL:
return type_factory->get_bool();
case ddl::TypeDefinition::STRING:
return type_factory->get_string();
case ddl::TypeDefinition::BYTES:
return type_factory->get_bytes();
case ddl::TypeDefinition::TIMESTAMP:
return type_factory->get_timestamp();
case ddl::TypeDefinition::DATE:
return type_factory->get_date();
case ddl::TypeDefinition::NUMERIC:
return type_factory->get_numeric();
case ddl::TypeDefinition::INTERVAL:
return type_factory->get_interval();
case ddl::TypeDefinition::PG_NUMERIC:
return postgres_translator::spangres::types::PgNumericMapping()
->mapped_type();
case ddl::TypeDefinition::JSON:
return type_factory->get_json();
case ddl::TypeDefinition::PG_JSONB:
return postgres_translator::spangres::types::PgJsonbMapping()
->mapped_type();
case ddl::TypeDefinition::ARRAY: {
ZETASQL_RET_CHECK(ddl_type_def.has_array_subtype())
<< "Missing array_subtype field for ddl::TypeDefinition input: "
<< ddl_type_def.ShortDebugString();
if (ddl_type_def.array_subtype().type() == ddl::TypeDefinition::ARRAY) {
// TODO : Update when we have a proper way to
// construct user-facing error messages in the error catalog.
return absl::Status(
absl::StatusCode::kInvalidArgument,
"Array of arrays type is not supported by the schema.");
}
ZETASQL_ASSIGN_OR_RETURN(
auto array_element_type,
DDLColumnTypeToGoogleSqlType(ddl_type_def.array_subtype(),
type_factory
,
proto_bundle
));
ZETASQL_RET_CHECK_NE(array_element_type, nullptr);
const zetasql::Type* array_type;
ZETASQL_RETURN_IF_ERROR(
type_factory->MakeArrayType(array_element_type, &array_type));
return array_type;
}
case ddl::TypeDefinition::STRUCT: {
std::vector<zetasql::StructType::StructField> struct_fields;
for (const ddl::TypeDefinition::StructDescriptor::Field& field :
ddl_type_def.struct_descriptor().field()) {
ZETASQL_ASSIGN_OR_RETURN(
const zetasql::Type* type,
DDLColumnTypeToGoogleSqlType(field.type(),
type_factory
,
proto_bundle
));
struct_fields.push_back({field.name(), type});
}
const zetasql::Type* struct_type;
ZETASQL_RETURN_IF_ERROR(
type_factory->MakeStructType(struct_fields, &struct_type));
return struct_type;
}
case ddl::TypeDefinition::TOKENLIST: {
return type_factory->get_tokenlist();
}
default:
if (ddl_type_def.type() == ddl::TypeDefinition::NONE &&
ddl_type_def.has_proto_type_name()) {
ZETASQL_RET_CHECK_NE(proto_bundle, nullptr);
auto proto_descriptor =
proto_bundle->GetTypeDescriptor(ddl_type_def.proto_type_name());
if (proto_descriptor.ok()) {
// PROTO
const zetasql::Type* proto_type;
ZETASQL_RETURN_IF_ERROR(type_factory->MakeProtoType(proto_descriptor.value(),
&proto_type));
return proto_type;
}
auto enum_descriptor =
proto_bundle->GetEnumTypeDescriptor(ddl_type_def.proto_type_name());
if (enum_descriptor.ok()) {
// ENUM
const zetasql::Type* enum_type;
ZETASQL_RETURN_IF_ERROR(
type_factory->MakeEnumType(enum_descriptor.value(), &enum_type));
return enum_type;
}
}
ZETASQL_RET_CHECK_FAIL() << "Unrecognized ddl::TypeDefinition: "
<< ddl_type_def.ShortDebugString();
}
}