diff --git a/iotdb-client/jdbc/pom.xml b/iotdb-client/jdbc/pom.xml
index ebd2651c84c1..68ed403dcf15 100644
--- a/iotdb-client/jdbc/pom.xml
+++ b/iotdb-client/jdbc/pom.xml
@@ -175,6 +175,9 @@
${project.build.outputDirectory}/META-INF/MANIFEST.MF
+
+ ${project.version}
+
@@ -209,6 +212,31 @@
+
+ maven-assembly-plugin
+ ${maven.assembly.version}
+
+
+ jar-with-dependencies
+
+
+
+ true
+
+
+
+
+
+ make-assembly
+
+
+ single
+
+
+ package
+
+
+
@@ -275,32 +303,5 @@
true
-
- get-jar-with-dependencies
-
-
-
- maven-assembly-plugin
- ${maven.assembly.version}
-
-
- jar-with-dependencies
-
-
-
-
- make-assembly
-
-
- single
-
-
- package
-
-
-
-
-
-
diff --git a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
index 66b1e57d092a..87bb726b21cf 100644
--- a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
+++ b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/Constant.java
@@ -24,8 +24,10 @@ public class Constant {
private Constant() {}
public static final String GLOBAL_DB_NAME = "IoTDB";
+ public static final String TABLE_DIALECT = "table";
+ public static final String TREE_DIALECT = "tree";
- static final String METHOD_NOT_SUPPORTED = "Method not supported";
+ public static final String METHOD_NOT_SUPPORTED = "Method not supported";
static final String PARAMETER_NOT_NULL = "The parameter cannot be null";
static final String PARAMETER_SUPPORTED =
"Parameter only supports BOOLEAN,INT32,INT64,FLOAT,DOUBLE,TEXT data type";
diff --git a/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBAbstractDatabaseMetadata.java b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBAbstractDatabaseMetadata.java
new file mode 100644
index 000000000000..303be66a695d
--- /dev/null
+++ b/iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBAbstractDatabaseMetadata.java
@@ -0,0 +1,2977 @@
+/*
+ * 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.iotdb.jdbc;
+
+import org.apache.iotdb.service.rpc.thrift.IClientRPCService;
+
+import org.apache.thrift.TException;
+import org.apache.tsfile.common.conf.TSFileConfig;
+import org.apache.tsfile.enums.TSDataType;
+import org.apache.tsfile.read.common.block.TsBlock;
+import org.apache.tsfile.read.common.block.TsBlockBuilder;
+import org.apache.tsfile.read.common.block.column.TsBlockSerde;
+import org.apache.tsfile.utils.Binary;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.sql.Connection;
+import java.sql.DatabaseMetaData;
+import java.sql.ResultSet;
+import java.sql.RowIdLifetime;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Types;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public abstract class IoTDBAbstractDatabaseMetadata implements DatabaseMetaData {
+
+ private static final Logger LOGGER = LoggerFactory.getLogger(IoTDBAbstractDatabaseMetadata.class);
+ private static final String METHOD_NOT_SUPPORTED_STRING = "Method not supported";
+ protected static final String CONVERT_ERROR_MSG = "Convert tsBlock error: {}";
+
+ protected IoTDBConnection connection;
+ protected IClientRPCService.Iface client;
+ protected long sessionId;
+ protected ZoneId zoneId;
+
+ protected static final String BOOLEAN = "BOOLEAN";
+ protected static final String DOUBLE = "DOUBLE";
+ protected static final String FLOAT = "FLOAT";
+ protected static final String INT32 = "INT32";
+ protected static final String INT64 = "INT64";
+ protected static final String STRING = "STRING";
+ protected static final String BLOB = "BLOB";
+ protected static final String TIMESTAMP = "TIMESTAMP";
+ protected static final String DATE = "DATE";
+
+ protected static String sqlKeywordsThatArentSQL92;
+
+ protected static final String BUFFER_LENGTH = "BUFFER_LENGTH";
+ protected static final String CHAR_OCTET_LENGTH = "CHAR_OCTET_LENGTH";
+ protected static final String COLUMN_NAME = "COLUMN_NAME";
+ protected static final String COLUMN_SIZE = "COLUMN_SIZE";
+ private static final String COLUMN_TYPE = "COLUMN_TYPE";
+ protected static final String DATA_TYPE = "DATA_TYPE";
+ protected static final String DECIMAL_DIGITS = "DECIMAL_DIGITS";
+ private static final String DEFERRABILITY = "DEFERRABILITY";
+ private static final String DELETE_RULE = "DELETE_RULE";
+ private static final String FK_NAME = "FK_NAME";
+ private static final String FKCOLUMN_NAME = "FKCOLUMN_NAME";
+ private static final String FKTABLE_CAT = "FKTABLE_CAT";
+ private static final String FKTABLE_NAME = "FKTABLE_NAME";
+ private static final String FKTABLE_SCHEM = "FKTABLE_SCHEM";
+ private static final String FUNCTION_CAT = "FUNCTION_CAT";
+ private static final String FUNCTION_NAME = "FUNCTION_NAME";
+ private static final String FUNCTION_SCHEM = "FUNCTION_SCHEM";
+ private static final String FUNCTION_TYPE = "FUNCTION_TYPE";
+ private static final String GRANTEE = "GRANTEE";
+ private static final String GRANTOR = "GRANTOR";
+ protected static final String IS_AUTOINCREMENT = "IS_AUTOINCREMENT";
+ private static final String IS_GRANTABLE = "IS_GRANTABLE";
+ protected static final String IS_NULLABLE = "IS_NULLABLE";
+ private static final String KEY_SEQ = "KEY_SEQ";
+ private static final String LENGTH = "LENGTH";
+ protected static final String NULLABLE = "NULLABLE";
+ protected static final String NUM_PREC_RADIX = "NUM_PREC_RADIX";
+ protected static final String ORDINAL_POSITION = "ORDINAL_POSITION";
+ private static final String PK_NAME = "PK_NAME";
+ private static final String PKCOLUMN_NAME = "PKCOLUMN_NAME";
+ private static final String PKTABLE_CAT = "PKTABLE_CAT";
+ private static final String PKTABLE_NAME = "PKTABLE_NAME";
+ private static final String PKTABLE_SCHEM = "PKTABLE_SCHEM";
+ protected static final String PRECISION = "PRECISION";
+ protected static final String PRIMARY = "PRIMARY";
+ private static final String PRIVILEGE = "PRIVILEGE";
+ private static final String PROCEDURE_CAT = "PROCEDURE_CAT";
+ private static final String PROCEDURE_NAME = "PROCEDURE_NAME";
+ private static final String PROCEDURE_SCHEM = "PROCEDURE_SCHEM";
+ private static final String PROCEDURE_TYPE = "PROCEDURE_TYPE";
+ private static final String PSEUDO_COLUMN = "PSEUDO_COLUMN";
+ private static final String RADIX = "RADIX";
+ protected static final String REMARKS = "REMARKS";
+ private static final String SCALE = "SCALE";
+ private static final String SCOPE = "SCOPE";
+ private static final String SPECIFIC_NAME = "SPECIFIC_NAME";
+ protected static final String SQL_DATA_TYPE = "SQL_DATA_TYPE";
+ protected static final String SQL_DATETIME_SUB = "SQL_DATETIME_SUB";
+ protected static final String TABLE_CAT = "TABLE_CAT";
+ protected static final String TABLE_SCHEM = "TABLE_SCHEM";
+ protected static final String TABLE_NAME = "TABLE_NAME";
+ protected static final String TABLE_TYPE = "TABLE_TYPE";
+ protected static final String TYPE_CAT = "TYPE_CAT";
+ protected static final String TYPE_NAME = "TYPE_NAME";
+ protected static final String TYPE_SCHEM = "TYPE_SCHEM";
+ private static final String UPDATE_RULE = "UPDATE_RULE";
+
+ private static final String SHOW_FUNCTIONS = "show functions";
+ private static final String SHOW_DATABASES_SQL = "SHOW DATABASES ";
+
+ private static TsBlockSerde serde = new TsBlockSerde();
+
+ public IoTDBAbstractDatabaseMetadata(
+ IoTDBConnection connection, IClientRPCService.Iface client, long sessionId, ZoneId zoneId) {
+ this.connection = connection;
+ this.client = client;
+ this.sessionId = sessionId;
+ this.zoneId = zoneId;
+ }
+
+ protected static String[] sql92Keywords = {
+ "ABSOLUTE",
+ "EXEC",
+ "OVERLAPS",
+ "ACTION",
+ "EXECUTE",
+ "PAD",
+ "ADA",
+ "EXISTS",
+ "PARTIAL",
+ "ADD",
+ "EXTERNAL",
+ "PASCAL",
+ "ALL",
+ "EXTRACT",
+ "POSITION",
+ "ALLOCATE",
+ "FALSE",
+ PRECISION,
+ "ALTER",
+ "FETCH",
+ "PREPARE",
+ "AND",
+ "FIRST",
+ "PRESERVE",
+ "ANY",
+ FLOAT,
+ PRIMARY,
+ "ARE",
+ "FOR",
+ "PRIOR",
+ "AS",
+ "FOREIGN",
+ "PRIVILEGES",
+ "ASC",
+ "FORTRAN",
+ "PROCEDURE",
+ "ASSERTION",
+ "FOUND",
+ "PUBLIC",
+ "AT",
+ "FROM",
+ "READ",
+ "AUTHORIZATION",
+ "FULL",
+ "REAL",
+ "AVG",
+ "GET",
+ "REFERENCES",
+ "BEGIN",
+ "GLOBAL",
+ "RELATIVE",
+ "BETWEEN",
+ "GO",
+ "RESTRICT",
+ "BIT",
+ "GOTO",
+ "REVOKE",
+ "BIT_LENGTH",
+ "GRANT",
+ "RIGHT",
+ "BOTH",
+ "GROUP",
+ "ROLLBACK",
+ "BY",
+ "HAVING",
+ "ROWS",
+ "CASCADE",
+ "HOUR",
+ "SCHEMA",
+ "CASCADED",
+ "IDENTITY",
+ "SCROLL",
+ "CASE",
+ "IMMEDIATE",
+ "SECOND",
+ "CAST",
+ "IN",
+ "SECTION",
+ "CATALOG",
+ "INCLUDE",
+ "SELECT",
+ "CHAR",
+ "INDEX",
+ "SESSION",
+ "CHAR_LENGTH",
+ "INDICATOR",
+ "SESSION_USER",
+ "CHARACTER",
+ "INITIALLY",
+ "SET",
+ "CHARACTER_LENGTH",
+ "INNER",
+ "SIZE",
+ "CHECK",
+ "INPUT",
+ "SMALLINT",
+ "CLOSE",
+ "INSENSITIVE",
+ "SOME",
+ "COALESCE",
+ "INSERT",
+ "SPACE",
+ "COLLATE",
+ "INT",
+ "SQL",
+ "COLLATION",
+ "INTEGER",
+ "SQLCA",
+ "COLUMN",
+ "INTERSECT",
+ "SQLCODE",
+ "COMMIT",
+ "INTERVAL",
+ "SQLERROR",
+ "CONNECT",
+ "INTO",
+ "SQLSTATE",
+ "CONNECTION",
+ "IS",
+ "SQLWARNING",
+ "CONSTRAINT",
+ "ISOLATION",
+ "SUBSTRING",
+ "CONSTRAINTS",
+ "JOIN",
+ "SUM",
+ "CONTINUE",
+ "KEY",
+ "SYSTEM_USER",
+ "CONVERT",
+ "LANGUAGE",
+ "TABLE",
+ "CORRESPONDING",
+ "LAST",
+ "TEMPORARY",
+ "COUNT",
+ "LEADING",
+ "THEN",
+ "CREATE",
+ "LEFT",
+ "TIME",
+ "CROSS",
+ "LEVEL",
+ "TIMESTAMP",
+ "CURRENT",
+ "LIKE",
+ "TIMEZONE_HOUR",
+ "CURRENT_DATE",
+ "LOCAL",
+ "TIMEZONE_MINUTE",
+ "CURRENT_TIME",
+ "LOWER",
+ "TO",
+ "CURRENT_TIMESTAMP",
+ "MATCH",
+ "TRAILING",
+ "CURRENT_USER",
+ "MAX",
+ "TRANSACTION",
+ "CURSOR",
+ "MIN",
+ "TRANSLATE",
+ "DATE",
+ "MINUTE",
+ "TRANSLATION",
+ "DAY",
+ "MODULE",
+ "TRIM",
+ "DEALLOCATE",
+ "MONTH",
+ "TRUE",
+ "DEC",
+ "NAMES",
+ "UNION",
+ "DECIMAL",
+ "NATIONAL",
+ "UNIQUE",
+ "DECLARE",
+ "NATURAL",
+ "UNKNOWN",
+ "DEFAULT",
+ "NCHAR",
+ "UPDATE",
+ "DEFERRABLE",
+ "NEXT",
+ "UPPER",
+ "DEFERRED",
+ "NO",
+ "USAGE",
+ "DELETE",
+ "NONE",
+ "USER",
+ "DESC",
+ "NOT",
+ "USING",
+ "DESCRIBE",
+ "NULL",
+ "VALUE",
+ "DESCRIPTOR",
+ "NULLIF",
+ "VALUES",
+ "DIAGNOSTICS",
+ "NUMERIC",
+ "VARCHAR",
+ "DISCONNECT",
+ "OCTET_LENGTH",
+ "VARYING",
+ "DISTINCT",
+ "OF",
+ "VIEW",
+ "DOMAIN",
+ "ON",
+ "WHEN",
+ DOUBLE,
+ "ONLY",
+ "WHENEVER",
+ "DROP",
+ "OPEN",
+ "WHERE",
+ "ELSE",
+ "OPTION",
+ "WITH",
+ "END",
+ "OR",
+ "WORK",
+ "END-EXEC",
+ "ORDER",
+ "WRITE",
+ "ESCAPE",
+ "OUTER",
+ "YEAR",
+ "EXCEPT",
+ "OUTPUT",
+ "ZONE",
+ "EXCEPTION"
+ };
+
+ public static ByteBuffer convertTsBlock(
+ List> valuesList, List tsDataTypeList) throws IOException {
+ TsBlockBuilder tsBlockBuilder = new TsBlockBuilder(tsDataTypeList);
+ for (List