ddl::TypeDefinition GoogleSqlTypeToDDLType()

in backend/schema/updater/ddl_type_conversion.cc [244:297]


ddl::TypeDefinition GoogleSqlTypeToDDLType(const zetasql::Type* type) {
  ddl::TypeDefinition type_def;
  if (type->IsArray()) {
    type_def.set_type(ddl::TypeDefinition::ARRAY);
    *type_def.mutable_array_subtype() =
        GoogleSqlTypeToDDLType(type->AsArray()->element_type());
    return type_def;
  }
  if (type->IsStruct()) {
    type_def.set_type(ddl::TypeDefinition::STRUCT);
    for (const zetasql::StructField& field : type->AsStruct()->fields()) {
      ddl::TypeDefinition::StructDescriptor::Field* ddl_field =
          type_def.mutable_struct_descriptor()->add_field();

      ddl_field->set_name(field.name);
      *ddl_field->mutable_type() = GoogleSqlTypeToDDLType(field.type);
    }
    return type_def;
  }

  type_def.set_type(ddl::TypeDefinition::NONE);
  if (type->IsDouble()) type_def.set_type(ddl::TypeDefinition::DOUBLE);
  if (type->IsFloat()) type_def.set_type(ddl::TypeDefinition::FLOAT);
  if (type->IsInt64()) type_def.set_type(ddl::TypeDefinition::INT64);
  if (type->IsBool()) type_def.set_type(ddl::TypeDefinition::BOOL);
  if (type->IsString()) type_def.set_type(ddl::TypeDefinition::STRING);
  if (type->IsBytes()) type_def.set_type(ddl::TypeDefinition::BYTES);
  if (type->IsTimestamp()) type_def.set_type(ddl::TypeDefinition::TIMESTAMP);
  if (type->IsDate()) type_def.set_type(ddl::TypeDefinition::DATE);
  if (type->IsNumericType()) type_def.set_type(ddl::TypeDefinition::NUMERIC);
  if (type->IsJson()) type_def.set_type(ddl::TypeDefinition::JSON);
  if (type->IsTokenList()) type_def.set_type(ddl::TypeDefinition::TOKENLIST);
  if (type->IsInterval()) type_def.set_type(ddl::TypeDefinition::INTERVAL);
  if (type->IsProto()) {
    type_def.set_type(ddl::TypeDefinition::NONE);
    type_def.set_proto_type_name(type->AsProto()->descriptor()->full_name());
  }
  if (type->IsEnum()) {
    type_def.set_type(ddl::TypeDefinition::NONE);
    type_def.set_proto_type_name(
        type->AsEnum()->enum_descriptor()->full_name());
  }
  if (type->IsExtendedType()) {
    if (type->Equals(postgres_translator::spangres::types::PgNumericMapping()
                         ->mapped_type())) {
      type_def.set_type(ddl::TypeDefinition::PG_NUMERIC);
    } else if (type->Equals(
                   postgres_translator::spangres::types::PgJsonbMapping()
                       ->mapped_type())) {
      type_def.set_type(ddl::TypeDefinition::PG_JSONB);
    }
  }
  return type_def;
}