in backend/datamodel/types.cc [36:80]
bool IsSupportedColumnType(const zetasql::Type* type) {
// According to https://cloud.google.com/spanner/docs/data-types
// Note: ZetaSQL currently doesn't support constructing array-of-array
// types.
if (type->IsArray()) {
const zetasql::Type* element_type = type->AsArray()->element_type();
if (element_type->IsArray()) {
return false;
}
return IsSupportedColumnType(element_type);
}
switch (type->kind()) {
case zetasql::TypeKind::TYPE_INT64:
case zetasql::TypeKind::TYPE_BOOL:
case zetasql::TypeKind::TYPE_FLOAT:
case zetasql::TypeKind::TYPE_DOUBLE:
case zetasql::TypeKind::TYPE_STRING:
case zetasql::TypeKind::TYPE_BYTES:
case zetasql::TypeKind::TYPE_TIMESTAMP:
case zetasql::TypeKind::TYPE_DATE:
case zetasql::TypeKind::TYPE_NUMERIC:
case zetasql::TypeKind::TYPE_JSON:
case zetasql::TypeKind::TYPE_TOKENLIST:
return true;
case zetasql::TypeKind::TYPE_PROTO:
case zetasql::TypeKind::TYPE_ENUM: {
return EmulatorFeatureFlags::instance().flags().enable_protos;
}
case zetasql::TypeKind::TYPE_EXTENDED: {
auto type_code = static_cast<const SpannerExtendedType*>(type)->code();
switch (type_code) {
case TypeAnnotationCode::PG_JSONB:
case TypeAnnotationCode::PG_NUMERIC:
return true;
default:
return false;
}
}
// INTERVAL is a query only type.
case zetasql::TypeKind::TYPE_INTERVAL:
return false;
default:
return false;
}
}