bool IsSupportedColumnType()

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;
  }
}