You are viewing a plain text version of this content. The canonical link for it is here.
Posted to reviews@iotdb.apache.org by "JackieTien97 (via GitHub)" <gi...@apache.org> on 2026/10/21 08:49:02 UTC

[PR] [JDBC] Fix table-model driver defects that break generic JDBC clients [iotdb]

JackieTien97 opened a new pull request, #18962:
URL: https://github.com/apache/iotdb/pull/18962

   ## Summary
   
   Fixes in the JDBC driver for the table model (`sql_dialect=table`) that break generic JDBC clients such as Trino's `BaseJdbcClient` and DBeaver. This is a driver-only change: the server is untouched.
   
   ### DatabaseMetaData (`IoTDBRelationalDatabaseMetadata`)
   - `getTables` / `getColumns` / `getPrimaryKeys` report the real database and table names in `TABLE_SCHEM` / `TABLE_NAME` instead of echoing the (escaped) search patterns, and report `TABLE_CAT` as NULL (`getTables` had no `TABLE_CAT` column at all).
   - `tableNamePattern`, `columnNamePattern` and `types` are honored. A null pattern no longer becomes `LIKE 'null'`, and quotes in patterns are escaped.
   - An empty result set is returned instead of `null`, and no empty TsBlock is sent any more (it was read back as one bogus row).
   - `NULLABLE` / `IS_NULLABLE` follow the TIME category instead of the column name, so a custom-named time column is reported correctly. `ORDINAL_POSITION` and `KEY_SEQ` are numbered within each table.
   - `getPrimaryKeys` matches the given names exactly, whether or not the caller escaped them.
   - The SHOW / DESC fallback, used when `information_schema` cannot be queried, applies the same patterns. `removeEscape` previously never removed an escape.
   - OBJECT columns are reported as `java.sql.Types.OTHER`.
   
   ### Statements and result sets
   - Prepared executions record the query id, so `cancel()` reaches the server, and they send the statement `fetchSize`.
   - `setTimestamp` converts values to the server time precision (ms / us / ns).
   - `setObject` (all overloads) accepts `java.time.LocalDate`.
   - SQL completed on the client is split at `?` the way the table-model lexer tokenizes it: string literals, quoted identifiers and comments hide `?`, and a backslash is an ordinary character.
   - `NaN` is written as `'NaN'`, which the server stores as NaN. Infinity has no accepted SQL form, so binding it in client-completed SQL fails with a clear `SQLException`. Server-prepared queries still send it in binary.
   - `getObject(int, Class)` and `getObject(String, Class)` support String, Boolean, Integer, Long, Float, Double, byte[], Timestamp and LocalDate.
   - `getTimestamp` returns null for SQL NULL, and the by-label variant honors the time precision.
   - `ResultSetMetaData` describes OBJECT columns (`OBJECT`, `Types.OTHER`).
   
   ### Connection
   - `setReadOnly(true)` is accepted as a hint. Trino calls it on every read connection.
   - New connections are in auto-commit mode, as JDBC requires.
   - `getCatalog()` returns null in the table dialect, and `setCatalog(null)` is ignored. The tree dialect keeps `Apache IoTDB`.
   
   ## Known limitation (needs server work)
   `Statement.cancel()` still cannot stop a query. `ClientRPCServiceImpl#cancelOperation` is unimplemented and always returns `QUERY_NOT_ALLOWED`, and the synchronized RPC client makes a cancel from another thread wait for the in-flight execute RPC. Now that prepared executions record their query id, `cancel()` on a prepared statement reaches the server and fails with a `SQLException`, as it already did for plain statements.
   
   ## Tests
   - `mvn test -pl iotdb-client/jdbc`: all 121 tests pass, both in the default build and with `-P with-zh-locale`. 47 of them are new.
   - Checked the connection defaults, `LocalDate` binding, NaN/Infinity handling and client-side `?` splitting against an IoTDB 2.0.10 server.
   
   🤖 Generated with [Claude Code](https://claude.com/claude-code)


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@iotdb.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [JDBC] Fix table-model driver defects that break generic JDBC clients [iotdb]

Posted by "github-advanced-security[bot] (via GitHub)" <gi...@apache.org>.
github-advanced-security[bot] commented on code in PR #18962:
URL: https://github.com/apache/iotdb/pull/18962#discussion_r4346546908


##########
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/relational/IoTDBRelationalDatabaseMetadata.java:
##########
@@ -504,14 +424,167 @@
       valuesList.add(valueInRow);
     }
 
-    // Convert Values to ByteBuffer
-    ByteBuffer tsBlock = null;
+    return toResultSet(stmt, fields, tsDataTypeList, valuesList);
+  }
+
+  /** Lists the tables matching the patterns, with their real database and table names. */
+  private List<TableInfo> listTables(Statement stmt, String schemaPattern, String tableNamePattern)
+      throws SQLException {
+    String sql = informationSchemaQuery("tables", schemaPattern, tableNamePattern);
+    try (ResultSet rs = stmt.executeQuery(sql)) {
+      List<TableInfo> tables = new ArrayList<>();
+      while (rs.next()) {
+        tables.add(
+            new TableInfo(
+                rs.getString("database"), rs.getString("table_name"), rs.getString("comment")));
+      }
+      return tables;
+    } catch (SQLException e) {
+      LOGGER.error(SHOW_TABLES_ERROR_MSG, e.getMessage());
+      try {
+        return listTablesWithShowStatements(stmt, schemaPattern, tableNamePattern);
+      } catch (SQLException fallbackException) {
+        e.addSuppressed(fallbackException);
+        throw e;
+      }
+    }
+  }
+
+  /**
+   * Lists tables with SHOW statements, for users who may not query information_schema. SHOW TABLES
+   * cannot filter by pattern, so the patterns are matched here.
+   */
+  private List<TableInfo> listTablesWithShowStatements(
+      Statement stmt, String schemaPattern, String tableNamePattern) throws SQLException {
+    List<String> databases = new ArrayList<>();
+    if (isLiteral(schemaPattern)) {
+      databases.add(removeEscape(schemaPattern));
+    } else {
+      try (ResultSet rs = stmt.executeQuery(SHOW_DATABASES_SQL)) {
+        while (rs.next()) {
+          String database = rs.getString(1);
+          if (matchesPattern(database, schemaPattern)) {
+            databases.add(database);
+          }
+        }
+      }
+    }
+
+    List<TableInfo> tables = new ArrayList<>();
+    for (String database : databases) {
+      try (ResultSet rs =
+          stmt.executeQuery("show tables details from " + quoteIdentifier(database))) {
+        while (rs.next()) {
+          String tableName = rs.getString("TableName");
+          if (matchesPattern(tableName, tableNamePattern)) {
+            tables.add(new TableInfo(database, tableName, rs.getString("Comment")));
+          }
+        }
+      }
+    }
+    return tables;
+  }
+
+  /**
+   * Lists the columns matching the patterns. ORDINAL_POSITION counts every column of the table, so
+   * the column name pattern is matched here rather than by the server.
+   */
+  private List<ColumnInfo> listColumns(
+      Statement stmt, String schemaPattern, String tableNamePattern, String columnNamePattern)
+      throws SQLException {
+    String sql = informationSchemaQuery("columns", schemaPattern, tableNamePattern);
+    try (ResultSet rs = stmt.executeQuery(sql)) {
+      List<ColumnInfo> columns = new ArrayList<>();
+      // information_schema lists the columns of each table in their defined order
+      Map<List<String>, Integer> ordinalPositions = new HashMap<>();
+      while (rs.next()) {
+        String database = rs.getString("database");
+        String tableName = rs.getString("table_name");
+        int ordinalPosition =
+            ordinalPositions.merge(Arrays.asList(database, tableName), 1, Integer::sum);
+        String columnName = rs.getString("column_name");
+        if (matchesPattern(columnName, columnNamePattern)) {
+          columns.add(
+              new ColumnInfo(
+                  database,
+                  tableName,
+                  columnName,
+                  rs.getString("datatype"),
+                  rs.getString("category"),
+                  rs.getString("comment"),
+                  ordinalPosition));
+        }
+      }
+      return columns;
+    } catch (SQLException e) {
+      LOGGER.error(SHOW_TABLES_ERROR_MSG, e.getMessage());
+      try {
+        return listColumnsWithDescribe(stmt, schemaPattern, tableNamePattern, columnNamePattern);
+      } catch (SQLException fallbackException) {
+        e.addSuppressed(fallbackException);
+        throw e;
+      }
+    }
+  }
+
+  /** Lists columns with DESC statements, for users who may not query information_schema. */
+  private List<ColumnInfo> listColumnsWithDescribe(
+      Statement stmt, String schemaPattern, String tableNamePattern, String columnNamePattern)
+      throws SQLException {
+    List<ColumnInfo> columns = new ArrayList<>();
+    for (TableInfo table : listTablesWithShowStatements(stmt, schemaPattern, tableNamePattern)) {
+      String sql =
+          "desc "
+              + quoteIdentifier(table.database())
+              + "."
+              + quoteIdentifier(table.tableName())
+              + " details";
+      try (ResultSet rs = stmt.executeQuery(sql)) {

Review Comment:
   ## SonarCloud / SQL queries should not be dynamically formatted
   
   <!--SONAR_ISSUE_KEY:AaFi4wdXcL4powoCO5E1-->Make sure using a dynamically formatted SQL query is safe here. <p>See more on <a href="https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AaFi4wdXcL4powoCO5E1&open=AaFi4wdXcL4powoCO5E1&pullRequest=18962">SonarQube Cloud</a></p>
   
   [Show more details](https://github.com/apache/iotdb/security/code-scanning/423)



##########
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/relational/IoTDBRelationalDatabaseMetadata.java:
##########
@@ -504,14 +424,167 @@
       valuesList.add(valueInRow);
     }
 
-    // Convert Values to ByteBuffer
-    ByteBuffer tsBlock = null;
+    return toResultSet(stmt, fields, tsDataTypeList, valuesList);
+  }
+
+  /** Lists the tables matching the patterns, with their real database and table names. */
+  private List<TableInfo> listTables(Statement stmt, String schemaPattern, String tableNamePattern)
+      throws SQLException {
+    String sql = informationSchemaQuery("tables", schemaPattern, tableNamePattern);
+    try (ResultSet rs = stmt.executeQuery(sql)) {
+      List<TableInfo> tables = new ArrayList<>();
+      while (rs.next()) {
+        tables.add(
+            new TableInfo(
+                rs.getString("database"), rs.getString("table_name"), rs.getString("comment")));
+      }
+      return tables;
+    } catch (SQLException e) {
+      LOGGER.error(SHOW_TABLES_ERROR_MSG, e.getMessage());
+      try {
+        return listTablesWithShowStatements(stmt, schemaPattern, tableNamePattern);
+      } catch (SQLException fallbackException) {
+        e.addSuppressed(fallbackException);
+        throw e;
+      }
+    }
+  }
+
+  /**
+   * Lists tables with SHOW statements, for users who may not query information_schema. SHOW TABLES
+   * cannot filter by pattern, so the patterns are matched here.
+   */
+  private List<TableInfo> listTablesWithShowStatements(
+      Statement stmt, String schemaPattern, String tableNamePattern) throws SQLException {
+    List<String> databases = new ArrayList<>();
+    if (isLiteral(schemaPattern)) {
+      databases.add(removeEscape(schemaPattern));
+    } else {
+      try (ResultSet rs = stmt.executeQuery(SHOW_DATABASES_SQL)) {
+        while (rs.next()) {
+          String database = rs.getString(1);
+          if (matchesPattern(database, schemaPattern)) {
+            databases.add(database);
+          }
+        }
+      }
+    }
+
+    List<TableInfo> tables = new ArrayList<>();
+    for (String database : databases) {
+      try (ResultSet rs =
+          stmt.executeQuery("show tables details from " + quoteIdentifier(database))) {

Review Comment:
   ## SonarCloud / SQL queries should not be dynamically formatted
   
   <!--SONAR_ISSUE_KEY:AaFi4wdXcL4powoCO5E0-->Make sure using a dynamically formatted SQL query is safe here. <p>See more on <a href="https://sonarcloud.io/project/issues?id=apache_iotdb&issues=AaFi4wdXcL4powoCO5E0&open=AaFi4wdXcL4powoCO5E0&pullRequest=18962">SonarQube Cloud</a></p>
   
   [Show more details](https://github.com/apache/iotdb/security/code-scanning/424)



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@iotdb.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [JDBC] Fix table-model driver defects that break generic JDBC clients [iotdb]

Posted by "JackieTien97 (via GitHub)" <gi...@apache.org>.
JackieTien97 commented on code in PR #18962:
URL: https://github.com/apache/iotdb/pull/18962#discussion_r4336375584


##########
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java:
##########
@@ -741,12 +796,20 @@ public Time getTime(String arg0, Calendar arg1) throws SQLException {
 
   @Override
   public Timestamp getTimestamp(int columnIndex) throws SQLException {
-    return convertToTimestamp(getLong(columnIndex), statement.getTimeFactor());
+    try {
+      return ioTDBRpcDataSet.getTimestamp(columnIndex);
+    } catch (StatementExecutionException e) {
+      throw new SQLException(e.getMessage());
+    }
   }
 
   @Override
   public Timestamp getTimestamp(String columnName) throws SQLException {
-    return new Timestamp(getLong(columnName));
+    try {
+      return ioTDBRpcDataSet.getTimestamp(columnName);

Review Comment:
   [P2] Preserve pre-epoch timestamps when reading by label
   
   With millisecond precision and a timestamp column containing `-1500`, `getTimestamp("ts")` now throws `SQLException: nanos > 999999999 or < 0`; the same test passes on the PR base and returns `new Timestamp(-1500L)`. This new path delegates to `RpcUtils.convertToTimestamp()`, whose ordinary division/remainder produces a negative nanos component for negative values that are not whole seconds. Please fix the shared conversion to use floor-based seconds and a nonnegative fractional component, and cover negative timestamps, before routing this getter through it.



##########
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBTablePreparedStatement.java:
##########
@@ -703,36 +748,51 @@ private String createCompleteSql(final String sql, Map<Integer, String> paramete
     return newSql.toString();
   }
 
+  /**
+   * Splits the SQL at its parameter markers, skipping string literals, quoted identifiers and
+   * comments as the table-model lexer does. Quotes are escaped only by doubling them; a backslash
+   * is an ordinary character.
+   */
   private List<String> splitSqlStatement(final String sql) {
     List<String> parts = new ArrayList<>();
-    int apCount = 0;
     int off = 0;
-    boolean skip = false;
-
-    for (int i = 0; i < sql.length(); i++) {
+    int i = 0;
+    while (i < sql.length()) {
       char c = sql.charAt(i);
-      if (skip) {
-        skip = false;
-        continue;
-      }
-      switch (c) {
-        case '\'':
-          apCount++;
-          break;
-        case '\\':
-          skip = true;
-          break;
-        case '?':
-          if ((apCount & 1) == 0) {
-            parts.add(sql.substring(off, i));
-            off = i + 1;
-          }
-          break;
-        default:
-          break;
+      if (c == '\'' || c == '"' || c == '`') {
+        i = skipQuoted(sql, i, c);
+      } else if (sql.startsWith("--", i)) {
+        int end = sql.indexOf('\n', i);
+        i = end < 0 ? sql.length() : end + 1;

Review Comment:
   [P2] Recognize carriage returns as line-comment terminators
   
   The table-model lexer's `SIMPLE_COMMENT` rule ends a comment at either `\r` or `\n`, but this scanner only searches for `\n`. For the Java string `"INSERT -- comment\rINTO t(time, s1) VALUES(?, ?)\n"`, binding both parameters and calling `executeUpdate()` still sends the two `?` markers unchanged because the scanner treats the remainder of the INSERT as a comment. This substitution test passes on the PR base and fails here. Please recognize lone CR as well as LF and CRLF so the client and server agree on where parameter markers are visible.



##########
iotdb-client/jdbc/src/main/java/org/apache/iotdb/jdbc/IoTDBTablePreparedStatement.java:
##########
@@ -446,10 +472,27 @@ public void setTime(int parameterIndex, Time x, Calendar cal) throws SQLExceptio
   @Override
   public void setTimestamp(int parameterIndex, Timestamp x) throws SQLException {
     checkParameterIndex(parameterIndex);
-    // Use millisecond value for SQL compatibility with TIMESTAMP columns
-    long timestampMs = x.getTime();
-    setPreparedParameterValue(parameterIndex, timestampMs, Types.BIGINT);
-    this.parameters.put(parameterIndex, Long.toString(timestampMs));
+    // The server reads time values in its own precision (ms, us or ns)
+    long time = toServerTime(x);
+    setPreparedParameterValue(parameterIndex, time, Types.BIGINT);
+    this.parameters.put(parameterIndex, Long.toString(time));
+  }
+
+  private long toServerTime(Timestamp x) throws SQLException {
+    int timeFactor = getTimeFactor();
+    // getTime() carries the milliseconds of getNanos(), so only its whole seconds are used
+    long seconds = Math.floorDiv(x.getTime(), 1_000L);
+    try {
+      return Math.addExact(
+          Math.multiplyExact(seconds, timeFactor), x.getNanos() / (1_000_000_000 / timeFactor));

Review Comment:
   [P3] Avoid intermediate underflow for valid nanosecond timestamps
   
   With nanosecond precision, `setTimestamp(1, Timestamp.from(Instant.parse("1677-09-21T00:12:43.145224193Z")))` throws the new out-of-range exception, although the correct value is `Long.MIN_VALUE + 1` and fits in a long. Flooring to whole seconds makes `seconds * timeFactor` underflow before the positive fractional component can bring the final result back into range. Please rearrange the negative-value arithmetic or check the complete converted value without overflowing the intermediate product, and add a lower-bound test alongside the existing far-future overflow test.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@iotdb.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [JDBC] Fix table-model driver defects that break generic JDBC clients [iotdb]

Posted by "JackieTien97 (via GitHub)" <gi...@apache.org>.
JackieTien97 merged PR #18962:
URL: https://github.com/apache/iotdb/pull/18962


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@iotdb.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [JDBC] Fix table-model driver defects that break generic JDBC clients [iotdb]

Posted by "codecov[bot] (via GitHub)" <gi...@apache.org>.
codecov[bot] commented on PR #18962:
URL: https://github.com/apache/iotdb/pull/18962#issuecomment-6315967900

   ## [Codecov](https://app.codecov.io/gh/apache/iotdb/pull/18962?dropdown=coverage&src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) Report
   :x: Patch coverage is `95.46926%` with `14 lines` in your changes missing coverage. Please review.
   :white_check_mark: Project coverage is 47.30%. Comparing base ([`4fceb75`](https://app.codecov.io/gh/apache/iotdb/commit/4fceb75dfd831369488223c639ee7a8532207792?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)) to head ([`a64c948`](https://app.codecov.io/gh/apache/iotdb/commit/a64c948405c15672bb5662bd2572ccc0f6e71992?dropdown=coverage&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache)).
   :warning: Report is 14 commits behind head on master.
   
   | [Files with missing lines](https://app.codecov.io/gh/apache/iotdb/pull/18962?dropdown=coverage&src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) | Patch % | Lines |
   |---|---|---|
   | [...bc/relational/IoTDBRelationalDatabaseMetadata.java](https://app.codecov.io/gh/apache/iotdb/pull/18962?src=pr&el=tree&filepath=iotdb-client%2Fjdbc%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fiotdb%2Fjdbc%2Frelational%2FIoTDBRelationalDatabaseMetadata.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-aW90ZGItY2xpZW50L2pkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lvdGRiL2pkYmMvcmVsYXRpb25hbC9Jb1REQlJlbGF0aW9uYWxEYXRhYmFzZU1ldGFkYXRhLmphdmE=) | 95.26% | [9 Missing :warning: ](https://app.codecov.io/gh/apache/iotdb/pull/18962?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...java/org/apache/iotdb/jdbc/IoTDBJDBCResultSet.java](https://app.codecov.io/gh/apache/iotdb/pull/18962?src=pr&el=tree&filepath=iotdb-client%2Fjdbc%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fiotdb%2Fjdbc%2FIoTDBJDBCResultSet.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-aW90ZGItY2xpZW50L2pkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lvdGRiL2pkYmMvSW9UREJKREJDUmVzdWx0U2V0LmphdmE=) | 90.69% | [4 Missing :warning: ](https://app.codecov.io/gh/apache/iotdb/pull/18962?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   | [...apache/iotdb/jdbc/IoTDBTablePreparedStatement.java](https://app.codecov.io/gh/apache/iotdb/pull/18962?src=pr&el=tree&filepath=iotdb-client%2Fjdbc%2Fsrc%2Fmain%2Fjava%2Forg%2Fapache%2Fiotdb%2Fjdbc%2FIoTDBTablePreparedStatement.java&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache#diff-aW90ZGItY2xpZW50L2pkYmMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2lvdGRiL2pkYmMvSW9UREJUYWJsZVByZXBhcmVkU3RhdGVtZW50LmphdmE=) | 98.11% | [1 Missing :warning: ](https://app.codecov.io/gh/apache/iotdb/pull/18962?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache) |
   
   <details><summary>Additional details and impacted files</summary>
   
   
   
   ```diff
   @@             Coverage Diff              @@
   ##             master   #18962      +/-   ##
   ============================================
   + Coverage     47.09%   47.30%   +0.20%     
   - Complexity      737      758      +21     
   ============================================
     Files          5539     5551      +12     
     Lines        405217   406598    +1381     
     Branches      53029    53267     +238     
   ============================================
   + Hits         190854   192332    +1478     
   + Misses       214363   214266      -97     
   ```
   </details>
   
   [:umbrella: View full report in Codecov by Harness](https://app.codecov.io/gh/apache/iotdb/pull/18962?dropdown=coverage&src=pr&el=continue&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).   
   :loudspeaker: Have feedback on the report? [Share it here](https://about.codecov.io/codecov-pr-comment-feedback/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=apache).
   <details><summary> :rocket: New features to boost your workflow: </summary>
   
   - :snowflake: [Test Analytics](https://docs.codecov.com/docs/test-analytics): Detect flaky tests, report on failures, and find test suite problems.
   </details>


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@iotdb.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [PR] [JDBC] Fix table-model driver defects that break generic JDBC clients [iotdb]

Posted by "sonarqubecloud[bot] (via GitHub)" <gi...@apache.org>.
sonarqubecloud[bot] commented on PR #18962:
URL: https://github.com/apache/iotdb/pull/18962#issuecomment-6337146901

   ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=apache_iotdb&pullRequest=18962) **Quality Gate failed**  
   Failed conditions  
   ![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [C Reliability Rating on New Code](https://sonarcloud.io/project/issues?id=apache_iotdb&pullRequest=18962&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true) (required ≥ A)  
   ![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [C Security Rating on New Code](https://sonarcloud.io/project/issues?id=apache_iotdb&pullRequest=18962&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true) (required ≥ A)  
     
   <!-- sqra:qg_revision=945dd323468c9d6ded4f8145e0068faaa54415577047acaeb20cb3b0d7a0269f -->
   <!-- sqra-placement-anchor -->
   [See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=apache_iotdb&pullRequest=18962)
   
   ##   
   ![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/light_bulb-16px.png '') Catch issues before they fail your Quality Gate with our IDE extension ![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/sonarlint-16px.png '') [SonarQube for IDE](https://www.sonarsource.com/products/sonarlint/features/connected-mode/?referrer=pull-request)
   
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: reviews-unsubscribe@iotdb.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org