This is an automated email from the ASF dual-hosted git repository.

mchades pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new 51e42ea79 [#5181] feat(oceanbase-catalog): Add implementation for 
converter package (#5182)
51e42ea79 is described below

commit 51e42ea79871be9d03497a9797d649fa415d92ac
Author: yuanoOo <[email protected]>
AuthorDate: Tue Oct 22 17:47:47 2024 +0800

    [#5181] feat(oceanbase-catalog): Add implementation for converter package 
(#5182)
    
    ### What changes were proposed in this pull request?
    
    - Add implementation for converter package:
      - `OceanBaseColumnDefaultValueConverter`
      - `OceanBaseExceptionConverter`
      - `OceanBaseTypeConverter`
    
    ### Why are the changes needed?
    
    Fix: #5181
    
    ### Does this PR introduce _any_ user-facing change?
    
    no
    
    ### How was this patch tested?
    
    Add unit test: `TestOceanBaseTypeConverter`
---
 .../jdbc/converter/JdbcExceptionConverter.java     |  27 ++++-
 .../gravitino/catalog/mysql/MysqlCatalog.java      |   7 --
 .../mysql/converter/MysqlExceptionConverter.java   |  50 ---------
 .../catalog/mysql/operation/TestMysql.java         |   4 +-
 .../catalog/oceanbase/OceanBaseCatalog.java        |   7 --
 .../OceanBaseColumnDefaultValueConverter.java      |  80 +++++++++++++-
 .../converter/OceanBaseExceptionConverter.java     |  33 ------
 .../converter/OceanBaseTypeConverter.java          | 116 ++++++++++++++++++++-
 .../converter/TestOceanBaseTypeConverter.java      | 112 ++++++++++++++++++++
 .../catalog/oceanbase/operation/TestOceanBase.java |   4 +-
 10 files changed, 328 insertions(+), 112 deletions(-)

diff --git 
a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/converter/JdbcExceptionConverter.java
 
b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/converter/JdbcExceptionConverter.java
index 7d8e5cc92..716cfc28d 100644
--- 
a/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/converter/JdbcExceptionConverter.java
+++ 
b/catalogs/catalog-jdbc-common/src/main/java/org/apache/gravitino/catalog/jdbc/converter/JdbcExceptionConverter.java
@@ -20,12 +20,18 @@ package org.apache.gravitino.catalog.jdbc.converter;
 
 import java.sql.SQLException;
 import org.apache.gravitino.exceptions.GravitinoRuntimeException;
+import org.apache.gravitino.exceptions.NoSuchSchemaException;
+import org.apache.gravitino.exceptions.NoSuchTableException;
+import org.apache.gravitino.exceptions.SchemaAlreadyExistsException;
+import org.apache.gravitino.exceptions.TableAlreadyExistsException;
 
 /** Interface for converter JDBC exceptions to Gravitino exceptions. */
-public abstract class JdbcExceptionConverter {
+public class JdbcExceptionConverter {
 
   /**
-   * Convert JDBC exception to GravitinoException.
+   * Convert JDBC exception to GravitinoException. The default implementation 
of this method is
+   * based on MySQL exception code, and if the catalog does not compatible 
with MySQL exception
+   * code, this method needs to be rewritten.
    *
    * @param sqlException The sql exception to map
    * @return The best attempt at a corresponding connector exception or 
generic with the
@@ -33,8 +39,19 @@ public abstract class JdbcExceptionConverter {
    */
   @SuppressWarnings("FormatStringAnnotation")
   public GravitinoRuntimeException toGravitinoException(final SQLException 
sqlException) {
-    // TODO we need to transform specific SQL exceptions into our own 
exceptions, such as
-    // SchemaAlreadyExistsException
-    return new GravitinoRuntimeException(sqlException, 
sqlException.getMessage());
+    switch (sqlException.getErrorCode()) {
+      case 1007:
+        return new SchemaAlreadyExistsException(sqlException, 
sqlException.getMessage());
+      case 1050:
+        return new TableAlreadyExistsException(sqlException, 
sqlException.getMessage());
+      case 1008:
+      case 1049:
+        return new NoSuchSchemaException(sqlException, 
sqlException.getMessage());
+      case 1146:
+      case 1051:
+        return new NoSuchTableException(sqlException, 
sqlException.getMessage());
+      default:
+        return new GravitinoRuntimeException(sqlException, 
sqlException.getMessage());
+    }
   }
 }
diff --git 
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/MysqlCatalog.java
 
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/MysqlCatalog.java
index e79a06c15..1cd0667ad 100644
--- 
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/MysqlCatalog.java
+++ 
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/MysqlCatalog.java
@@ -22,12 +22,10 @@ import java.util.Map;
 import org.apache.gravitino.catalog.jdbc.JdbcCatalog;
 import 
org.apache.gravitino.catalog.jdbc.MySQLProtocolCompatibleCatalogOperations;
 import 
org.apache.gravitino.catalog.jdbc.converter.JdbcColumnDefaultValueConverter;
-import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
 import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
 import org.apache.gravitino.catalog.jdbc.operation.JdbcDatabaseOperations;
 import org.apache.gravitino.catalog.jdbc.operation.JdbcTableOperations;
 import 
org.apache.gravitino.catalog.mysql.converter.MysqlColumnDefaultValueConverter;
-import org.apache.gravitino.catalog.mysql.converter.MysqlExceptionConverter;
 import org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter;
 import org.apache.gravitino.catalog.mysql.operation.MysqlDatabaseOperations;
 import org.apache.gravitino.catalog.mysql.operation.MysqlTableOperations;
@@ -62,11 +60,6 @@ public class MysqlCatalog extends JdbcCatalog {
     return new MysqlCatalogCapability();
   }
 
-  @Override
-  protected JdbcExceptionConverter createExceptionConverter() {
-    return new MysqlExceptionConverter();
-  }
-
   @Override
   protected JdbcTypeConverter createJdbcTypeConverter() {
     return new MysqlTypeConverter();
diff --git 
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlExceptionConverter.java
 
b/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlExceptionConverter.java
deleted file mode 100644
index 058d5234e..000000000
--- 
a/catalogs/catalog-jdbc-mysql/src/main/java/org/apache/gravitino/catalog/mysql/converter/MysqlExceptionConverter.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.gravitino.catalog.mysql.converter;
-
-import java.sql.SQLException;
-import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
-import org.apache.gravitino.exceptions.GravitinoRuntimeException;
-import org.apache.gravitino.exceptions.NoSuchSchemaException;
-import org.apache.gravitino.exceptions.NoSuchTableException;
-import org.apache.gravitino.exceptions.SchemaAlreadyExistsException;
-import org.apache.gravitino.exceptions.TableAlreadyExistsException;
-
-/** Exception converter to Apache Gravitino exception for MySQL. */
-public class MysqlExceptionConverter extends JdbcExceptionConverter {
-
-  @SuppressWarnings("FormatStringAnnotation")
-  @Override
-  public GravitinoRuntimeException toGravitinoException(SQLException se) {
-    switch (se.getErrorCode()) {
-      case 1007:
-        return new SchemaAlreadyExistsException(se, se.getMessage());
-      case 1050:
-        return new TableAlreadyExistsException(se, se.getMessage());
-      case 1008:
-      case 1049:
-        return new NoSuchSchemaException(se, se.getMessage());
-      case 1146:
-      case 1051:
-        return new NoSuchTableException(se, se.getMessage());
-      default:
-        return new GravitinoRuntimeException(se, se.getMessage());
-    }
-  }
-}
diff --git 
a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysql.java
 
b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysql.java
index 417678e79..50c3c3602 100644
--- 
a/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysql.java
+++ 
b/catalogs/catalog-jdbc-mysql/src/test/java/org/apache/gravitino/catalog/mysql/operation/TestMysql.java
@@ -25,9 +25,9 @@ import java.util.Map;
 import javax.sql.DataSource;
 import org.apache.gravitino.catalog.jdbc.TestJdbc;
 import org.apache.gravitino.catalog.jdbc.config.JdbcConfig;
+import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
 import org.apache.gravitino.catalog.jdbc.utils.DataSourceUtils;
 import 
org.apache.gravitino.catalog.mysql.converter.MysqlColumnDefaultValueConverter;
-import org.apache.gravitino.catalog.mysql.converter.MysqlExceptionConverter;
 import org.apache.gravitino.catalog.mysql.converter.MysqlTypeConverter;
 import org.apache.gravitino.integration.test.container.ContainerSuite;
 import org.apache.gravitino.integration.test.container.MySQLContainer;
@@ -48,7 +48,7 @@ public class TestMysql extends TestJdbc {
 
     DATABASE_OPERATIONS = new MysqlDatabaseOperations();
     TABLE_OPERATIONS = new MysqlTableOperations();
-    JDBC_EXCEPTION_CONVERTER = new MysqlExceptionConverter();
+    JDBC_EXCEPTION_CONVERTER = new JdbcExceptionConverter();
     DATABASE_OPERATIONS.initialize(dataSource, JDBC_EXCEPTION_CONVERTER, 
Collections.emptyMap());
     TABLE_OPERATIONS.initialize(
         dataSource,
diff --git 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/OceanBaseCatalog.java
 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/OceanBaseCatalog.java
index 6dbfeccc3..123192644 100644
--- 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/OceanBaseCatalog.java
+++ 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/OceanBaseCatalog.java
@@ -22,12 +22,10 @@ import java.util.Map;
 import org.apache.gravitino.catalog.jdbc.JdbcCatalog;
 import org.apache.gravitino.catalog.jdbc.JdbcCatalogOperations;
 import 
org.apache.gravitino.catalog.jdbc.converter.JdbcColumnDefaultValueConverter;
-import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
 import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
 import org.apache.gravitino.catalog.jdbc.operation.JdbcDatabaseOperations;
 import org.apache.gravitino.catalog.jdbc.operation.JdbcTableOperations;
 import 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseColumnDefaultValueConverter;
-import 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseExceptionConverter;
 import org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter;
 import 
org.apache.gravitino.catalog.oceanbase.operation.OceanBaseDatabaseOperations;
 import 
org.apache.gravitino.catalog.oceanbase.operation.OceanBaseTableOperations;
@@ -57,11 +55,6 @@ public class OceanBaseCatalog extends JdbcCatalog {
     return new OceanBaseCatalogCapability();
   }
 
-  @Override
-  protected JdbcExceptionConverter createExceptionConverter() {
-    return new OceanBaseExceptionConverter();
-  }
-
   @Override
   protected JdbcTypeConverter createJdbcTypeConverter() {
     return new OceanBaseTypeConverter();
diff --git 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseColumnDefaultValueConverter.java
 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseColumnDefaultValueConverter.java
index 0f6fae44f..4f151290b 100644
--- 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseColumnDefaultValueConverter.java
+++ 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseColumnDefaultValueConverter.java
@@ -18,10 +18,20 @@
  */
 package org.apache.gravitino.catalog.oceanbase.converter;
 
+import static org.apache.gravitino.rel.Column.DEFAULT_VALUE_NOT_SET;
+import static 
org.apache.gravitino.rel.Column.DEFAULT_VALUE_OF_CURRENT_TIMESTAMP;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.util.Objects;
 import 
org.apache.gravitino.catalog.jdbc.converter.JdbcColumnDefaultValueConverter;
 import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
-import org.apache.gravitino.exceptions.GravitinoRuntimeException;
 import org.apache.gravitino.rel.expressions.Expression;
+import org.apache.gravitino.rel.expressions.UnparsedExpression;
+import org.apache.gravitino.rel.expressions.literals.Literals;
+import org.apache.gravitino.rel.types.Decimal;
+import org.apache.gravitino.rel.types.Types;
 
 public class OceanBaseColumnDefaultValueConverter extends 
JdbcColumnDefaultValueConverter {
 
@@ -31,6 +41,72 @@ public class OceanBaseColumnDefaultValueConverter extends 
JdbcColumnDefaultValue
       String columnDefaultValue,
       boolean isExpression,
       boolean nullable) {
-    throw new GravitinoRuntimeException("Not implemented yet.");
+    if (Objects.isNull(columnDefaultValue)) {
+      return nullable ? Literals.NULL : DEFAULT_VALUE_NOT_SET;
+    }
+
+    if (columnDefaultValue.equalsIgnoreCase(NULL)) {
+      return Literals.NULL;
+    }
+
+    if (isExpression) {
+      if (columnDefaultValue.equals(CURRENT_TIMESTAMP)) {
+        return DEFAULT_VALUE_OF_CURRENT_TIMESTAMP;
+      }
+      // The parsing of OceanBase expressions is complex, so we are not 
currently undertaking the
+      // parsing.
+      return UnparsedExpression.of(columnDefaultValue);
+    }
+
+    switch (type.getTypeName().toLowerCase()) {
+      case OceanBaseTypeConverter.TINYINT:
+        return Literals.byteLiteral(Byte.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.TINYINT_UNSIGNED:
+        return Literals.unsignedByteLiteral(Short.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.SMALLINT:
+        return Literals.shortLiteral(Short.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.SMALLINT_UNSIGNED:
+        return 
Literals.unsignedShortLiteral(Integer.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.INT:
+        return Literals.integerLiteral(Integer.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.INT_UNSIGNED:
+        return 
Literals.unsignedIntegerLiteral(Long.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.BIGINT:
+        return Literals.longLiteral(Long.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.BIGINT_UNSIGNED:
+        return Literals.unsignedLongLiteral(Decimal.of(columnDefaultValue));
+      case OceanBaseTypeConverter.FLOAT:
+        return Literals.floatLiteral(Float.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.DOUBLE:
+        return Literals.doubleLiteral(Double.valueOf(columnDefaultValue));
+      case OceanBaseTypeConverter.NUMBER:
+      case OceanBaseTypeConverter.NUMERIC:
+      case OceanBaseTypeConverter.DECIMAL:
+        return Literals.decimalLiteral(
+            Decimal.of(
+                columnDefaultValue,
+                Integer.parseInt(type.getColumnSize()),
+                Integer.parseInt(type.getScale())));
+      case JdbcTypeConverter.DATE:
+        return Literals.dateLiteral(LocalDate.parse(columnDefaultValue, 
DATE_FORMATTER));
+      case JdbcTypeConverter.TIME:
+        return Literals.timeLiteral(LocalTime.parse(columnDefaultValue, 
DATE_TIME_FORMATTER));
+      case JdbcTypeConverter.TIMESTAMP:
+      case OceanBaseTypeConverter.DATETIME:
+        return CURRENT_TIMESTAMP.equals(columnDefaultValue)
+            ? DEFAULT_VALUE_OF_CURRENT_TIMESTAMP
+            : Literals.timestampLiteral(
+                LocalDateTime.parse(columnDefaultValue, DATE_TIME_FORMATTER));
+      case JdbcTypeConverter.VARCHAR:
+        return Literals.of(
+            columnDefaultValue, 
Types.VarCharType.of(Integer.parseInt(type.getColumnSize())));
+      case OceanBaseTypeConverter.CHAR:
+        return Literals.of(
+            columnDefaultValue, 
Types.FixedCharType.of(Integer.parseInt(type.getColumnSize())));
+      case JdbcTypeConverter.TEXT:
+        return Literals.stringLiteral(columnDefaultValue);
+      default:
+        return UnparsedExpression.of(columnDefaultValue);
+    }
   }
 }
diff --git 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseExceptionConverter.java
 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseExceptionConverter.java
deleted file mode 100644
index 102e7abca..000000000
--- 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseExceptionConverter.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *  http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.gravitino.catalog.oceanbase.converter;
-
-import java.sql.SQLException;
-import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
-import org.apache.gravitino.exceptions.GravitinoRuntimeException;
-
-/** Exception converter to Apache Gravitino exception for OceanBase. */
-public class OceanBaseExceptionConverter extends JdbcExceptionConverter {
-
-  @SuppressWarnings("FormatStringAnnotation")
-  @Override
-  public GravitinoRuntimeException toGravitinoException(SQLException se) {
-    return new GravitinoRuntimeException("Not implemented yet.");
-  }
-}
diff --git 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseTypeConverter.java
 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseTypeConverter.java
index a13d1fe8f..19a432dfd 100644
--- 
a/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseTypeConverter.java
+++ 
b/catalogs/catalog-jdbc-oceanbase/src/main/java/org/apache/gravitino/catalog/oceanbase/converter/OceanBaseTypeConverter.java
@@ -19,22 +19,130 @@
 package org.apache.gravitino.catalog.oceanbase.converter;
 
 import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
-import org.apache.gravitino.exceptions.GravitinoRuntimeException;
 import org.apache.gravitino.rel.types.Type;
+import org.apache.gravitino.rel.types.Types;
 
 /** Type converter for OceanBase. */
 public class OceanBaseTypeConverter extends JdbcTypeConverter {
 
-  // More data types will be added.
   static final String TINYINT = "tinyint";
+  static final String TINYINT_UNSIGNED = "tinyint unsigned";
+  static final String SMALLINT = "smallint";
+  static final String SMALLINT_UNSIGNED = "smallint unsigned";
+  static final String INT = "int";
+  static final String INT_UNSIGNED = "int unsigned";
+  static final String BIGINT = "bigint";
+  static final String BIGINT_UNSIGNED = "bigint unsigned";
+  static final String FLOAT = "float";
+  static final String DOUBLE = "double";
+  static final String DECIMAL = "decimal";
+  static final String NUMBER = "number";
+  static final String NUMERIC = "numeric";
+  static final String CHAR = "char";
+  static final String BINARY = "binary";
+  static final String DATETIME = "datetime";
 
   @Override
   public Type toGravitino(JdbcTypeBean typeBean) {
-    throw new GravitinoRuntimeException("Not implemented yet.");
+    switch (typeBean.getTypeName().toLowerCase()) {
+      case TINYINT:
+        return Types.ByteType.get();
+      case TINYINT_UNSIGNED:
+        return Types.ByteType.unsigned();
+      case SMALLINT:
+        return Types.ShortType.get();
+      case SMALLINT_UNSIGNED:
+        return Types.ShortType.unsigned();
+      case INT:
+        return Types.IntegerType.get();
+      case INT_UNSIGNED:
+        return Types.IntegerType.unsigned();
+      case BIGINT:
+        return Types.LongType.get();
+      case BIGINT_UNSIGNED:
+        return Types.LongType.unsigned();
+      case FLOAT:
+        return Types.FloatType.get();
+      case DOUBLE:
+        return Types.DoubleType.get();
+      case DATE:
+        return Types.DateType.get();
+      case TIME:
+        return Types.TimeType.get();
+      case TIMESTAMP:
+        return Types.TimestampType.withTimeZone();
+      case DATETIME:
+        return Types.TimestampType.withoutTimeZone();
+      case NUMBER:
+      case NUMERIC:
+      case DECIMAL:
+        return Types.DecimalType.of(
+            Integer.parseInt(typeBean.getColumnSize()), 
Integer.parseInt(typeBean.getScale()));
+      case VARCHAR:
+        return 
Types.VarCharType.of(Integer.parseInt(typeBean.getColumnSize()));
+      case CHAR:
+        return 
Types.FixedCharType.of(Integer.parseInt(typeBean.getColumnSize()));
+      case TEXT:
+        return Types.StringType.get();
+      case BINARY:
+        return Types.BinaryType.get();
+      default:
+        return Types.ExternalType.of(typeBean.getTypeName());
+    }
   }
 
   @Override
   public String fromGravitino(Type type) {
-    throw new GravitinoRuntimeException("Not implemented yet.");
+    if (type instanceof Types.ByteType) {
+      if (((Types.ByteType) type).signed()) {
+        return TINYINT;
+      } else {
+        return TINYINT_UNSIGNED;
+      }
+    } else if (type instanceof Types.ShortType) {
+      if (((Types.ShortType) type).signed()) {
+        return SMALLINT;
+      } else {
+        return SMALLINT_UNSIGNED;
+      }
+    } else if (type instanceof Types.IntegerType) {
+      if (((Types.IntegerType) type).signed()) {
+        return INT;
+      } else {
+        return INT_UNSIGNED;
+      }
+    } else if (type instanceof Types.LongType) {
+      if (((Types.LongType) type).signed()) {
+        return BIGINT;
+      } else {
+        return BIGINT_UNSIGNED;
+      }
+    } else if (type instanceof Types.FloatType) {
+      return type.simpleString();
+    } else if (type instanceof Types.DoubleType) {
+      return type.simpleString();
+    } else if (type instanceof Types.BooleanType) {
+      return type.simpleString();
+    } else if (type instanceof Types.StringType) {
+      return TEXT;
+    } else if (type instanceof Types.DateType) {
+      return type.simpleString();
+    } else if (type instanceof Types.TimeType) {
+      return type.simpleString();
+    } else if (type instanceof Types.TimestampType) {
+      return ((Types.TimestampType) type).hasTimeZone() ? TIMESTAMP : DATETIME;
+    } else if (type instanceof Types.DecimalType) {
+      return type.simpleString();
+    } else if (type instanceof Types.VarCharType) {
+      return type.simpleString();
+    } else if (type instanceof Types.FixedCharType) {
+      return type.simpleString();
+    } else if (type instanceof Types.BinaryType) {
+      return type.simpleString();
+    } else if (type instanceof Types.ExternalType) {
+      return ((Types.ExternalType) type).catalogString();
+    }
+    throw new IllegalArgumentException(
+        String.format("Couldn't convert Gravitino type %s to OceanBase type", 
type.simpleString()));
   }
 }
diff --git 
a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/converter/TestOceanBaseTypeConverter.java
 
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/converter/TestOceanBaseTypeConverter.java
new file mode 100644
index 000000000..8b044fea9
--- /dev/null
+++ 
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/converter/TestOceanBaseTypeConverter.java
@@ -0,0 +1,112 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.gravitino.catalog.oceanbase.converter;
+
+import static 
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.DATE;
+import static 
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.TEXT;
+import static 
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.TIME;
+import static 
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.TIMESTAMP;
+import static 
org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter.VARCHAR;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.BIGINT;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.BINARY;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.CHAR;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.DATETIME;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.DECIMAL;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.DOUBLE;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.FLOAT;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.INT;
+import static 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter.TINYINT;
+
+import org.apache.gravitino.catalog.jdbc.converter.JdbcTypeConverter;
+import org.apache.gravitino.rel.types.Type;
+import org.apache.gravitino.rel.types.Types;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Test class for {@link 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter}
+ */
+public class TestOceanBaseTypeConverter {
+
+  private static final OceanBaseTypeConverter OCEANBASE_TYPE_CONVERTER =
+      new OceanBaseTypeConverter();
+  private static final String USER_DEFINED_TYPE = "user-defined";
+
+  @Test
+  public void testToGravitinoType() {
+    checkJdbcTypeToGravitinoType(Types.ByteType.get(), TINYINT, null, null);
+    checkJdbcTypeToGravitinoType(Types.IntegerType.get(), INT, null, null);
+    checkJdbcTypeToGravitinoType(Types.LongType.get(), BIGINT, null, null);
+    checkJdbcTypeToGravitinoType(Types.FloatType.get(), FLOAT, null, null);
+    checkJdbcTypeToGravitinoType(Types.DoubleType.get(), DOUBLE, null, null);
+    checkJdbcTypeToGravitinoType(Types.DateType.get(), DATE, null, null);
+    checkJdbcTypeToGravitinoType(Types.TimeType.get(), TIME, null, null);
+    checkJdbcTypeToGravitinoType(Types.TimestampType.withoutTimeZone(), 
DATETIME, null, null);
+    checkJdbcTypeToGravitinoType(Types.TimestampType.withTimeZone(), 
TIMESTAMP, null, null);
+    checkJdbcTypeToGravitinoType(Types.DecimalType.of(10, 2), DECIMAL, "10", 
"2");
+    checkJdbcTypeToGravitinoType(Types.VarCharType.of(20), VARCHAR, "20", 
null);
+    checkJdbcTypeToGravitinoType(Types.FixedCharType.of(20), CHAR, "20", null);
+    checkJdbcTypeToGravitinoType(Types.StringType.get(), TEXT, null, null);
+    checkJdbcTypeToGravitinoType(Types.BinaryType.get(), BINARY, null, null);
+    checkJdbcTypeToGravitinoType(
+        Types.ExternalType.of(USER_DEFINED_TYPE), USER_DEFINED_TYPE, null, 
null);
+  }
+
+  @Test
+  public void testFromGravitinoType() {
+    checkGravitinoTypeToJdbcType(TINYINT, Types.ByteType.get());
+    checkGravitinoTypeToJdbcType(INT, Types.IntegerType.get());
+    checkGravitinoTypeToJdbcType(BIGINT, Types.LongType.get());
+    checkGravitinoTypeToJdbcType(FLOAT, Types.FloatType.get());
+    checkGravitinoTypeToJdbcType(DOUBLE, Types.DoubleType.get());
+    checkGravitinoTypeToJdbcType(DATE, Types.DateType.get());
+    checkGravitinoTypeToJdbcType(TIME, Types.TimeType.get());
+    checkGravitinoTypeToJdbcType(TIMESTAMP, 
Types.TimestampType.withTimeZone());
+    checkGravitinoTypeToJdbcType(DATETIME, 
Types.TimestampType.withoutTimeZone());
+    checkGravitinoTypeToJdbcType(DECIMAL + "(10,2)", Types.DecimalType.of(10, 
2));
+    checkGravitinoTypeToJdbcType(VARCHAR + "(20)", Types.VarCharType.of(20));
+    checkGravitinoTypeToJdbcType(CHAR + "(20)", Types.FixedCharType.of(20));
+    checkGravitinoTypeToJdbcType(TEXT, Types.StringType.get());
+    checkGravitinoTypeToJdbcType(BINARY, Types.BinaryType.get());
+    checkGravitinoTypeToJdbcType(USER_DEFINED_TYPE, 
Types.ExternalType.of(USER_DEFINED_TYPE));
+    Assertions.assertThrows(
+        IllegalArgumentException.class,
+        () -> 
OCEANBASE_TYPE_CONVERTER.fromGravitino(Types.UnparsedType.of(USER_DEFINED_TYPE)));
+  }
+
+  protected void checkGravitinoTypeToJdbcType(String jdbcTypeName, Type 
gravitinoType) {
+    Assertions.assertEquals(jdbcTypeName, 
OCEANBASE_TYPE_CONVERTER.fromGravitino(gravitinoType));
+  }
+
+  protected void checkJdbcTypeToGravitinoType(
+      Type gravitinoType, String jdbcTypeName, String columnSize, String 
scale) {
+    JdbcTypeConverter.JdbcTypeBean typeBean = createTypeBean(jdbcTypeName, 
columnSize, scale);
+    Assertions.assertEquals(gravitinoType, 
OCEANBASE_TYPE_CONVERTER.toGravitino(typeBean));
+  }
+
+  protected static JdbcTypeConverter.JdbcTypeBean createTypeBean(
+      String typeName, String columnSize, String scale) {
+    return new JdbcTypeConverter.JdbcTypeBean(typeName) {
+      {
+        setColumnSize(columnSize);
+        setScale(scale);
+      }
+    };
+  }
+}
diff --git 
a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBase.java
 
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBase.java
index f904a068b..4cb41d9a8 100644
--- 
a/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBase.java
+++ 
b/catalogs/catalog-jdbc-oceanbase/src/test/java/org/apache/gravitino/catalog/oceanbase/operation/TestOceanBase.java
@@ -23,9 +23,9 @@ import java.util.Collections;
 import java.util.Map;
 import org.apache.gravitino.catalog.jdbc.TestJdbc;
 import org.apache.gravitino.catalog.jdbc.config.JdbcConfig;
+import org.apache.gravitino.catalog.jdbc.converter.JdbcExceptionConverter;
 import org.apache.gravitino.catalog.jdbc.utils.DataSourceUtils;
 import 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseColumnDefaultValueConverter;
-import 
org.apache.gravitino.catalog.oceanbase.converter.OceanBaseExceptionConverter;
 import org.apache.gravitino.catalog.oceanbase.converter.OceanBaseTypeConverter;
 import org.apache.gravitino.integration.test.container.ContainerSuite;
 import org.apache.gravitino.integration.test.container.OceanBaseContainer;
@@ -44,7 +44,7 @@ public class TestOceanBase extends TestJdbc {
 
     DATABASE_OPERATIONS = new OceanBaseDatabaseOperations();
     TABLE_OPERATIONS = new OceanBaseTableOperations();
-    JDBC_EXCEPTION_CONVERTER = new OceanBaseExceptionConverter();
+    JDBC_EXCEPTION_CONVERTER = new JdbcExceptionConverter();
     DATABASE_OPERATIONS.initialize(DATA_SOURCE, JDBC_EXCEPTION_CONVERTER, 
Collections.emptyMap());
     TABLE_OPERATIONS.initialize(
         DATA_SOURCE,

Reply via email to