This is an automated email from the ASF dual-hosted git repository. jackietien pushed a commit to branch DisableObjectType in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit b68e924e1de716313441dd64a55069c166ae3594 Author: JackieTien97 <[email protected]> AuthorDate: Mon Jan 12 14:16:07 2026 +0800 Disable READ_OBJECT Function --- .../it/query/object/IoTDBObjectQuery2IT.java | 326 --------------------- .../it/query/object/IoTDBObjectQueryIT.java | 309 ------------------- .../relational/ColumnTransformerBuilder.java | 36 --- .../iotdb/db/queryengine/plan/QueryInfo.java | 56 ++++ .../iotdb/db/queryengine/plan/StatedQueryInfo.java | 22 ++ .../relational/metadata/TableMetadataImpl.java | 18 -- .../binary/ReadObject2ColumnTransformer.java | 78 ----- .../ternary/ReadObject3ColumnTransformer.java | 99 ------- .../unary/scalar/ReadObjectColumnTransformer.java | 126 -------- .../relational/TableBuiltinScalarFunction.java | 1 - 10 files changed, 78 insertions(+), 993 deletions(-) diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQuery2IT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQuery2IT.java deleted file mode 100644 index d5d194b0416..00000000000 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQuery2IT.java +++ /dev/null @@ -1,326 +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.iotdb.relational.it.query.object; - -import org.apache.iotdb.isession.ITableSession; -import org.apache.iotdb.isession.SessionDataSet; -import org.apache.iotdb.it.env.EnvFactory; -import org.apache.iotdb.it.framework.IoTDBTestRunner; -import org.apache.iotdb.itbase.category.TableClusterIT; -import org.apache.iotdb.itbase.category.TableLocalStandaloneIT; -import org.apache.iotdb.itbase.env.BaseEnv; -import org.apache.iotdb.rpc.IoTDBConnectionException; -import org.apache.iotdb.rpc.StatementExecutionException; - -import org.apache.tsfile.utils.Binary; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; - -import java.sql.Connection; -import java.sql.Statement; -import java.time.LocalDate; - -@RunWith(IoTDBTestRunner.class) -@Category({TableLocalStandaloneIT.class, TableClusterIT.class}) -public class IoTDBObjectQuery2IT { - - private static final String DATABASE_NAME = "test"; - - @BeforeClass - public static void setUp() throws Exception { - EnvFactory.getEnv().getConfig().getCommonConfig().setDataReplicationFactor(1); - EnvFactory.getEnv().initClusterEnvironment(); - try (Connection connection = EnvFactory.getEnv().getConnection(BaseEnv.TABLE_SQL_DIALECT); - Statement statement = connection.createStatement()) { - statement.execute("CREATE DATABASE " + DATABASE_NAME); - statement.execute("USE " + DATABASE_NAME); - statement.execute( - "CREATE TABLE table1(device STRING TAG, s4 DATE FIELD, s5 TIMESTAMP FIELD, s6 BLOB FIELD, s7 STRING FIELD, s8 OBJECT FIELD, s9 OBJECT FIELD)"); - for (int i = 1; i <= 10; i++) { - for (int j = 0; j < 10; j++) { - statement.execute( - String.format( - "insert into table1(time, device, s4, s5, s6, s7, s8) " - + "values(%d, '%s', '%s', %d, %s, '%s', %s)", - j, - "d" + i, - LocalDate.of(2024, 5, i % 31 + 1), - j, - "X'cafebabe'", - j, - "to_object(true, 0, X'cafebabe')")); - } - } - } - } - - @AfterClass - public static void tearDown() { - EnvFactory.getEnv().cleanClusterEnvironment(); - } - - @Test - public void testObjectLength() throws IoTDBConnectionException, StatementExecutionException { - try (ITableSession session = EnvFactory.getEnv().getTableSessionConnection()) { - session.executeNonQueryStatement("USE " + DATABASE_NAME); - SessionDataSet sessionDataSet = - session.executeQueryStatement("select length(s8) from table1 limit 1"); - SessionDataSet.DataIterator iterator = sessionDataSet.iterator(); - while (iterator.next()) { - long length = iterator.getLong(1); - Assert.assertEquals(4, length); - } - } - } - - @Test - public void testReadObject() throws IoTDBConnectionException, StatementExecutionException { - try (ITableSession session = EnvFactory.getEnv().getTableSessionConnection()) { - session.executeNonQueryStatement("USE " + DATABASE_NAME); - SessionDataSet sessionDataSet = - session.executeQueryStatement("select read_object(s8) from table1 where device = 'd2'"); - SessionDataSet.DataIterator iterator = sessionDataSet.iterator(); - byte[] expected = new byte[] {(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; - while (iterator.next()) { - Binary blob = iterator.getBlob(1); - Assert.assertArrayEquals(expected, blob.getValues()); - } - - sessionDataSet = - session.executeQueryStatement( - "select read_object(s8, 1) from table1 where device = 'd3'"); - iterator = sessionDataSet.iterator(); - expected = new byte[] {(byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; - while (iterator.next()) { - Binary blob = iterator.getBlob(1); - Assert.assertArrayEquals(expected, blob.getValues()); - } - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select read_object(s8, 1, 2) from table1 where device = 'd1'"); - iterator = sessionDataSet.iterator(); - expected = new byte[] {(byte) 0xFE, (byte) 0xBA}; - while (iterator.next()) { - Binary blob = iterator.getBlob(1); - Assert.assertArrayEquals(expected, blob.getValues()); - } - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select read_object(s8, 1, 1000) from table1 where device = 'd1'"); - iterator = sessionDataSet.iterator(); - expected = new byte[] {(byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; - while (iterator.next()) { - Binary blob = iterator.getBlob(1); - Assert.assertArrayEquals(expected, blob.getValues()); - } - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select count(*) from table1 where device = 'd1' and s6 = read_object(s8)"); - iterator = sessionDataSet.iterator(); - while (iterator.next()) { - long count = iterator.getLong(1); - Assert.assertEquals(10, count); - } - sessionDataSet.close(); - - // read_object are not pushed down. Read remote files - sessionDataSet = - session.executeQueryStatement( - "select read_object(t1_s8) from (select t1.s8 as t1_s8, t2.s8 as t2_s8 from table1 as t1 inner join table1 as t2 using(time))"); - iterator = sessionDataSet.iterator(); - expected = new byte[] {(byte) 0xCA, (byte) 0xFE, (byte) 0xBA, (byte) 0xBE}; - while (iterator.next()) { - Binary blob = iterator.getBlob(1); - Assert.assertArrayEquals(expected, blob.getValues()); - } - sessionDataSet.close(); - } - } - - @Test - public void testFunctionAndClauses() - throws IoTDBConnectionException, StatementExecutionException { - try (ITableSession session = EnvFactory.getEnv().getTableSessionConnection()) { - session.executeNonQueryStatement("USE " + DATABASE_NAME); - - SessionDataSet sessionDataSet = - session.executeQueryStatement( - "select length(s8) from table1 where device = 'd2' and s8 is not null limit 1"); - SessionDataSet.DataIterator iterator = sessionDataSet.iterator(); - while (iterator.next()) { - Assert.assertEquals(4, iterator.getLong(1)); - } - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select count(s8), first(s8), last(s8), first_by(s8, time), last_by(s8, time) from table1 where device = 'd1' and cast(s8 as string) = '(Object) 4 B' and try_cast(s8 as string) = '(Object) 4 B'"); - iterator = sessionDataSet.iterator(); - while (iterator.next()) { - Assert.assertEquals(10, iterator.getLong(1)); - Assert.assertEquals("(Object) 4 B", iterator.getString(2)); - Assert.assertEquals("(Object) 4 B", iterator.getString(3)); - Assert.assertEquals("(Object) 4 B", iterator.getString(4)); - Assert.assertEquals("(Object) 4 B", iterator.getString(5)); - } - sessionDataSet.close(); - - sessionDataSet = session.executeQueryStatement("select coalesce(s9, s8) from table1"); - iterator = sessionDataSet.iterator(); - while (iterator.next()) { - Assert.assertEquals("(Object) 4 B", iterator.getString(1)); - } - sessionDataSet.close(); - - // MATCH_RECOGNIZE - Assert.assertThrows( - StatementExecutionException.class, - () -> - session.executeNonQueryStatement( - "select m.cnt from table1 match_recognize (order by s8 measures RPR_LAST(time) as cnt one row per match pattern (B+) define B as B.s6 = prev(B.s6)) as m")); - Assert.assertThrows( - StatementExecutionException.class, - () -> - session.executeNonQueryStatement( - "select m.cnt from table1 match_recognize (partition by s8 measures RPR_LAST(time) as cnt one row per match pattern (B+) define B as B.s6 = prev(B.s6)) as m")); - - sessionDataSet = - session.executeQueryStatement( - "select m.value from table1 match_recognize(partition by s6 measures prev(s8) as value one row per match pattern (B+) define B as B.s6=prev(B.s6)) as m"); - iterator = sessionDataSet.iterator(); - while (iterator.next()) { - Assert.assertEquals("(Object) 4 B", iterator.getString(1)); - } - sessionDataSet.close(); - - // WHERE - session.executeQueryStatement( - "select time, s8 from table1 where device = 'd10' and s8 is not null"); - iterator = sessionDataSet.iterator(); - while (iterator.next()) { - Assert.assertEquals("(Object) 4 B", iterator.getString(2)); - } - sessionDataSet.close(); - - // GROUP BY - Assert.assertThrows( - StatementExecutionException.class, - () -> session.executeQueryStatement("select count(*) from table1 group by s8")); - - // ORDER BY - Assert.assertThrows( - StatementExecutionException.class, - () -> session.executeQueryStatement("select count(*) from table1 order by s8")); - - // FILL - sessionDataSet = - session.executeQueryStatement( - "select time, s8 from table1 where device = 'd10' fill method linear"); - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select time, s8 from table1 where device = 'd10' fill method previous"); - iterator = sessionDataSet.iterator(); - while (iterator.next()) { - Assert.assertEquals("(Object) 4 B", iterator.getString(2)); - } - sessionDataSet.close(); - - // HAVING - sessionDataSet = - session.executeQueryStatement( - "select device, count(s8) from table1 group by device having count(s8) > 0"); - iterator = sessionDataSet.iterator(); - while (iterator.next()) { - long count = iterator.getLong(2); - Assert.assertEquals(10, count); - } - sessionDataSet.close(); - - // WINDOW - Assert.assertThrows( - StatementExecutionException.class, - () -> - session.executeQueryStatement( - "select *, nth_value(s8,2) over(partition by s8) from table1")); - Assert.assertThrows( - StatementExecutionException.class, - () -> - session.executeQueryStatement( - "select *, nth_value(s8,2) over(order by s8) from table1")); - sessionDataSet = - session.executeQueryStatement( - "select *, nth_value(s8,2) over(partition by device) from table1"); - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select *, lead(s8) over(partition by device order by time) from table1"); - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select *, first_value(s8) over(partition by device) from table1"); - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select *, last_value(s8) over(partition by device) from table1"); - sessionDataSet.close(); - - sessionDataSet = - session.executeQueryStatement( - "select *, lag(s8) over(partition by device order by time) from table1"); - sessionDataSet.close(); - - // Table-value function - Assert.assertThrows( - StatementExecutionException.class, - () -> - session.executeQueryStatement( - "select * from session(data => table1 partition by s8, timecol => 'time', gap => 1ms)")); - Assert.assertThrows( - StatementExecutionException.class, - () -> - session.executeQueryStatement( - "select * from session(data => table1 order by s8, timecol => 'time', gap => 1ms)")); - sessionDataSet = - session.executeQueryStatement( - "select * from hop(data => table1, timecol => 'time', slide => 1ms, size => 2ms)"); - iterator = sessionDataSet.iterator(); - while (iterator.next()) { - String str = iterator.getString("s8"); - Assert.assertEquals("(Object) 4 B", str); - } - sessionDataSet.close(); - } - } -} diff --git a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQueryIT.java b/integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQueryIT.java deleted file mode 100644 index fadcf72d578..00000000000 --- a/integration-test/src/test/java/org/apache/iotdb/relational/it/query/object/IoTDBObjectQueryIT.java +++ /dev/null @@ -1,309 +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.iotdb.relational.it.query.object; - -import org.apache.iotdb.isession.ITableSession; -import org.apache.iotdb.isession.SessionConfig; -import org.apache.iotdb.isession.SessionDataSet; -import org.apache.iotdb.it.env.EnvFactory; -import org.apache.iotdb.it.framework.IoTDBTestRunner; -import org.apache.iotdb.itbase.category.TableClusterIT; -import org.apache.iotdb.itbase.category.TableLocalStandaloneIT; -import org.apache.iotdb.itbase.env.BaseEnv; -import org.apache.iotdb.rpc.IoTDBConnectionException; -import org.apache.iotdb.rpc.StatementExecutionException; - -import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.Field; -import org.apache.tsfile.read.common.RowRecord; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; - -import static org.apache.iotdb.db.it.utils.TestUtils.prepareTableData; -import static org.apache.iotdb.jdbc.IoTDBJDBCResultSet.OBJECT_ERR_MSG; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -@RunWith(IoTDBTestRunner.class) -@Category({TableLocalStandaloneIT.class, TableClusterIT.class}) -public class IoTDBObjectQueryIT { - - private static final String DATABASE_NAME = "test_db"; - - private static final String TIME_ZONE = "+00:00"; - - private static final String[] createSqls = - new String[] { - "CREATE DATABASE " + DATABASE_NAME, - "USE " + DATABASE_NAME, - "CREATE TABLE t1(device_id STRING TAG, o1 OBJECT, b1 BLOB, s1 STRING, l1 INT64, l2 INT64)", - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd1', X'cafebabe01', to_object(true, 0, X'cafebabe01'), 'cafebabe01', 0, 100)", - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(2, 'd1', X'cafebabe0202', to_object(true, 0, X'cafebabe02'), 'cafebabe02', 0, 100)", - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(3, 'd1', X'cafebabe0303', to_object(true, 0, X'cafebabe03'), 'cafebabe03', 0, 100)", - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(4, 'd1', X'cafebabe04', to_object(true, 0, X'cafebabe04'), 'cafebabe04', 0, 100)", - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd2', X'cafebade01', to_object(true, 0, X'cafebade01'), 'cafebade01', 0, 100)", - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(2, 'd2', X'cafebade0202', to_object(true, 0, X'cafebade02'), 'cafebade02', 0, 100)", - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(3, 'd2', X'cafebade0302', to_object(true, 0, X'cafebade03'), 'cafebade03', 0, 100)", - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(4, 'd2', X'cafebade04', to_object(true, 0, X'cafebade04'), 'cafebade04', 0, 100)", - "FLUSH", - }; - - @BeforeClass - public static void classSetUp() { - EnvFactory.getEnv().initClusterEnvironment(); - prepareTableData(createSqls); - } - - @AfterClass - public static void classTearDown() { - EnvFactory.getEnv().cleanClusterEnvironment(); - } - - @Test - public void jdbcTest() { - try (Connection connection = - EnvFactory.getEnv() - .getConnection( - SessionConfig.DEFAULT_USER, - SessionConfig.DEFAULT_PASSWORD, - BaseEnv.TABLE_SQL_DIALECT)) { - connection.setClientInfo("time_zone", TIME_ZONE); - try (Statement statement = connection.createStatement()) { - statement.execute("use " + DATABASE_NAME); - try (ResultSet resultSet = - statement.executeQuery( - "SELECT time, b1, o1, s1 FROM t1 WHERE device_id = 'd1' ORDER BY time")) { - int cnt = 0; - while (resultSet.next()) { - cnt++; - try { - resultSet.getBlob(3); - fail(); - } catch (SQLException e) { - assertEquals(OBJECT_ERR_MSG, e.getMessage()); - } - - try { - resultSet.getBytes("o1"); - fail(); - } catch (SQLException e) { - assertEquals(OBJECT_ERR_MSG, e.getMessage()); - } - - String s = resultSet.getString(3); - assertEquals("(Object) 5 B", s); - } - assertEquals(4, cnt); - } - - try (ResultSet resultSet = - statement.executeQuery( - "SELECT time, b1, READ_OBJECT(o1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) { - int cnt = 0; - String[] ans = {"0xcafebade01", "0xcafebade04"}; - while (resultSet.next()) { - String s = resultSet.getString(3); - assertEquals(ans[cnt], s); - cnt++; - } - assertEquals(2, cnt); - } - - try (ResultSet resultSet = - statement.executeQuery( - "SELECT time, b1, READ_OBJECT(o1, 0, -1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) { - int cnt = 0; - String[] ans = {"0xcafebade01", "0xcafebade04"}; - while (resultSet.next()) { - String s = resultSet.getString(3); - assertEquals(ans[cnt], s); - cnt++; - } - assertEquals(2, cnt); - } - - try (ResultSet resultSet = - statement.executeQuery( - "SELECT time, b1, READ_OBJECT(o1, l1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) { - int cnt = 0; - String[] ans = {"0xcafebade01", "0xcafebade04"}; - while (resultSet.next()) { - String s = resultSet.getString(3); - assertEquals(ans[cnt], s); - cnt++; - } - assertEquals(2, cnt); - } - - try (ResultSet resultSet = - statement.executeQuery( - "SELECT time, b1, READ_OBJECT(o1, l1, l2), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) { - int cnt = 0; - String[] ans = {"0xcafebade01", "0xcafebade04"}; - while (resultSet.next()) { - String s = resultSet.getString(3); - assertEquals(ans[cnt], s); - cnt++; - } - assertEquals(2, cnt); - } - - try (ResultSet resultSet = - statement.executeQuery( - "SELECT time, b1, READ_OBJECT(o1, l1, -1), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) { - int cnt = 0; - String[] ans = {"0xcafebade01", "0xcafebade04"}; - while (resultSet.next()) { - String s = resultSet.getString(3); - assertEquals(ans[cnt], s); - cnt++; - } - assertEquals(2, cnt); - } - - try (ResultSet resultSet = - statement.executeQuery( - "SELECT time, b1, READ_OBJECT(o1, 0, l2), s1 FROM t1 WHERE device_id = 'd2' AND READ_OBJECT(o1)=b1 ORDER BY time")) { - int cnt = 0; - String[] ans = {"0xcafebade01", "0xcafebade04"}; - while (resultSet.next()) { - String s = resultSet.getString(3); - assertEquals(ans[cnt], s); - cnt++; - } - assertEquals(2, cnt); - } - - try (ResultSet resultSet = - statement.executeQuery( - "SELECT time, b1, o1, s1 FROM t1 WHERE device_id = 'd1' FILL METHOD LINEAR")) { - int cnt = 0; - while (resultSet.next()) { - cnt++; - String s = resultSet.getString(3); - assertEquals("(Object) 5 B", s); - } - assertEquals(4, cnt); - } - } - } catch (SQLException e) { - e.printStackTrace(); - fail(e.getMessage()); - } - } - - @Test - public void sessionTest() { - try (ITableSession session = EnvFactory.getEnv().getTableSessionConnection()) { - session.executeNonQueryStatement("USE " + DATABASE_NAME); - - // SessionDataSet - try (SessionDataSet dataSet = - session.executeQueryStatement( - "SELECT time, b1, o1, s1 FROM t1 WHERE device_id = 'd1' ORDER BY time")) { - int cnt = 0; - while (dataSet.hasNext()) { - cnt++; - RowRecord rowRecord = dataSet.next(); - Field field = rowRecord.getField(2); - String s = field.getStringValue(); - assertEquals("(Object) 5 B", s); - Object blob = field.getObjectValue(TSDataType.OBJECT); - assertTrue(blob instanceof String); - assertEquals("(Object) 5 B", blob); - - try { - field.getBinaryV(); - fail(); - } catch (UnsupportedOperationException e) { - assertEquals("OBJECT Type only support getStringValue", e.getMessage()); - } - } - assertEquals(4, cnt); - } - - // SessionDataSet.DataIterator - try (SessionDataSet dataSet = - session.executeQueryStatement( - "SELECT time, b1, o1, s1 FROM t1 WHERE device_id = 'd2' ORDER BY time")) { - SessionDataSet.DataIterator iterator = dataSet.iterator(); - int cnt = 0; - while (iterator.next()) { - cnt++; - Object o = iterator.getObject(3); - assertTrue(o instanceof String); - assertEquals("(Object) 5 B", o); - String s = iterator.getString("o1"); - assertEquals("(Object) 5 B", s); - try { - iterator.getBlob(3); - fail(); - } catch (StatementExecutionException e) { - assertEquals("OBJECT Type only support getString", e.getMessage()); - } - } - assertEquals(4, cnt); - } - } catch (IoTDBConnectionException | StatementExecutionException e) { - fail(e.getMessage()); - } - } - - @Test - public void testIllegalObjectValue() { - try (ITableSession session = EnvFactory.getEnv().getTableSessionConnection()) { - session.executeNonQueryStatement("USE " + DATABASE_NAME); - try { - session.executeNonQueryStatement( - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd1', X'cafebabe01', 1, 'cafebabe01', 0, 100)"); - fail(); - } catch (StatementExecutionException e) { - Assert.assertTrue(e.getMessage().contains("data type is not consistent")); - } - - try { - session.executeNonQueryStatement( - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd1', X'cafebabe01', 'test', 'cafebabe01', 0, 100)"); - fail(); - } catch (StatementExecutionException e) { - Assert.assertTrue(e.getMessage().contains("data type is not consistent")); - } - - try { - session.executeNonQueryStatement( - "INSERT INTO t1(time, device_id, b1, o1, s1, l1, l2) VALUES(1, 'd1', X'cafebabe01', X'cafebabe01', 'cafebabe01', 0, 100)"); - } catch (StatementExecutionException e) { - Assert.assertTrue(e.getMessage().contains("data type is not consistent")); - } - } catch (IoTDBConnectionException | StatementExecutionException e) { - fail(e.getMessage()); - } - } -} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java index f34070c5e9a..7400aa7fb23 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/relational/ColumnTransformerBuilder.java @@ -85,7 +85,6 @@ import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.CompareL import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.CompareNonEqualColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.HmacColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.Like2ColumnTransformer; -import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.ReadObject2ColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.binary.factory.HmacStrategiesFactory; import org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.ConstantColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.leaf.IdentityColumnTransformer; @@ -106,7 +105,6 @@ import org.apache.iotdb.db.queryengine.transformation.dag.column.multi.LogicalOr import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.BetweenColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.Like3ColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.LpadColumnTransformer; -import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.ReadObject3ColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.ternary.RpadColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.udf.UserDefineScalarFunctionTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.IsNullColumnTransformer; @@ -170,7 +168,6 @@ import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.Ob import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.RTrim2ColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.RTrimColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.RadiansColumnTransformer; -import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.ReadObjectColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.RegexpLike2ColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.RegexpLikeColumnTransformer; import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.Replace2ColumnTransformer; @@ -1462,39 +1459,6 @@ public class ColumnTransformerBuilder this.process(children.get(0), context), this.process(children.get(1), context), this.process(children.get(2), context)); - } else if (TableBuiltinScalarFunction.READ_OBJECT - .getFunctionName() - .equalsIgnoreCase(functionName)) { - ColumnTransformer first = this.process(children.get(0), context); - if (children.size() == 1) { - return new ReadObjectColumnTransformer(BLOB, first, context.fragmentInstanceContext); - } else if (children.size() == 2) { - Expression offset = children.get(1); - if (isLongLiteral(offset)) { - return new ReadObjectColumnTransformer( - BLOB, - ((LongLiteral) children.get(1)).getParsedValue(), - first, - context.fragmentInstanceContext); - } else { - return new ReadObject2ColumnTransformer( - BLOB, first, this.process(offset, context), context.fragmentInstanceContext); - } - } else { - if (isLongLiteral(children.get(1)) && isLongLiteral(children.get(2))) { - long offset = ((LongLiteral) children.get(1)).getParsedValue(); - long length = ((LongLiteral) children.get(2)).getParsedValue(); - return new ReadObjectColumnTransformer( - BLOB, offset, length, first, context.fragmentInstanceContext); - } else { - return new ReadObject3ColumnTransformer( - BLOB, - first, - this.process(children.get(1), context), - this.process(children.get(2), context), - context.fragmentInstanceContext); - } - } } else { // user defined function if (TableUDFUtils.isScalarFunction(functionName)) { diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/QueryInfo.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/QueryInfo.java new file mode 100644 index 00000000000..cb4c99b020e --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/QueryInfo.java @@ -0,0 +1,56 @@ +package org.apache.iotdb.db.queryengine.plan; + +public class QueryInfo { + private final String queryId; + private final long startTime; + private final long endTime; + private final long costTime; + private final String statement; + private final String user; + private final String clientHost; + + public QueryInfo( + String queryId, + long startTime, + long endTime, + long costTime, + String statement, + String user, + String clientHost) { + this.queryId = queryId; + this.startTime = startTime; + this.endTime = endTime; + this.costTime = costTime; + this.statement = statement; + this.user = user; + this.clientHost = clientHost; + } + + public String getQueryId() { + return queryId; + } + + public long getStartTime() { + return startTime; + } + + public long getEndTime() { + return endTime; + } + + public long getCostTime() { + return costTime; + } + + public String getStatement() { + return statement; + } + + public String getUser() { + return user; + } + + public String getClientHost() { + return clientHost; + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/StatedQueryInfo.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/StatedQueryInfo.java new file mode 100644 index 00000000000..fc973026dcf --- /dev/null +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/StatedQueryInfo.java @@ -0,0 +1,22 @@ +package org.apache.iotdb.db.queryengine.plan; + +public class StatedQueryInfo extends QueryInfo { + private final String queryState; + + public StatedQueryInfo( + String queryId, + long startTime, + long endTime, + long costTime, + String statement, + String user, + String clientHost, + String queryState) { + super(queryId, startTime, endTime, costTime, statement, user, clientHost); + this.queryState = queryState; + } + + public String getQueryState() { + return queryState; + } +} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java index 7786876e19a..5df442d4d32 100644 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java +++ b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/plan/relational/metadata/TableMetadataImpl.java @@ -35,9 +35,7 @@ import org.apache.iotdb.db.exception.sql.SemanticException; import org.apache.iotdb.db.queryengine.common.MPPQueryContext; import org.apache.iotdb.db.queryengine.common.SessionInfo; import org.apache.iotdb.db.queryengine.plan.analyze.ClusterPartitionFetcher; -import org.apache.iotdb.db.queryengine.plan.analyze.IModelFetcher; import org.apache.iotdb.db.queryengine.plan.analyze.IPartitionFetcher; -import org.apache.iotdb.db.queryengine.plan.analyze.ModelFetcher; import org.apache.iotdb.db.queryengine.plan.relational.function.OperatorType; import org.apache.iotdb.db.queryengine.plan.relational.function.TableBuiltinTableFunction; import org.apache.iotdb.db.queryengine.plan.relational.function.arithmetic.AdditionResolver; @@ -99,8 +97,6 @@ public class TableMetadataImpl implements Metadata { private final DataNodeTableCache tableCache = DataNodeTableCache.getInstance(); - private final IModelFetcher modelFetcher = ModelFetcher.getInstance(); - @Override public boolean tableExists(final QualifiedObjectName name) { return tableCache.getTable(name.getDatabaseName(), name.getObjectName(), false) != null; @@ -1081,20 +1077,6 @@ public class TableMetadataImpl implements Metadata { functionName)); } return BLOB; - } else if (TableBuiltinScalarFunction.READ_OBJECT - .getFunctionName() - .equalsIgnoreCase(functionName)) { - if (argumentTypes.isEmpty() - || argumentTypes.size() > 3 - || !isObjectType(argumentTypes.get(0)) - || (argumentTypes.size() >= 2 && !isIntegerNumber(argumentTypes.get(1))) - || (argumentTypes.size() >= 3 && !isIntegerNumber(argumentTypes.get(2)))) { - throw new SemanticException( - "Scalar function " - + functionName.toLowerCase(Locale.ENGLISH) - + " must have at 1~3 arguments, and first argument must be OBJECT type, other arguments must be int32 or int64 type"); - } - return BLOB; } // builtin aggregation function diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/ReadObject2ColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/ReadObject2ColumnTransformer.java deleted file mode 100644 index e382f0f8f65..00000000000 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/binary/ReadObject2ColumnTransformer.java +++ /dev/null @@ -1,78 +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.iotdb.db.queryengine.transformation.dag.column.binary; - -import org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext; -import org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer; - -import org.apache.tsfile.block.column.Column; -import org.apache.tsfile.block.column.ColumnBuilder; -import org.apache.tsfile.read.common.type.Type; - -import java.util.Optional; - -import static org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.ReadObjectColumnTransformer.transform; - -public class ReadObject2ColumnTransformer extends BinaryColumnTransformer { - - private final Optional<FragmentInstanceContext> fragmentInstanceContext; - - public ReadObject2ColumnTransformer( - Type returnType, - ColumnTransformer leftTransformer, - ColumnTransformer rightTransformer, - Optional<FragmentInstanceContext> fragmentInstanceContext) { - super(returnType, leftTransformer, rightTransformer); - this.fragmentInstanceContext = fragmentInstanceContext; - } - - @Override - protected void doTransform( - Column leftColumn, Column rightColumn, ColumnBuilder builder, int positionCount) { - for (int i = 0; i < positionCount; i++) { - if (!leftColumn.isNull(i) && !rightColumn.isNull(i)) { - transform(leftColumn, builder, i, rightColumn.getLong(i), -1, this.fragmentInstanceContext); - } else { - builder.appendNull(); - } - } - } - - @Override - protected void doTransform( - Column leftColumn, - Column rightColumn, - ColumnBuilder builder, - int positionCount, - boolean[] selection) { - for (int i = 0; i < positionCount; i++) { - if (selection[i] && !leftColumn.isNull(i) && !rightColumn.isNull(i)) { - transform(leftColumn, builder, i, rightColumn.getLong(i), -1, this.fragmentInstanceContext); - } else { - builder.appendNull(); - } - } - } - - @Override - protected void checkType() { - // do nothing - } -} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/ReadObject3ColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/ReadObject3ColumnTransformer.java deleted file mode 100644 index 73381ebfe90..00000000000 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/ternary/ReadObject3ColumnTransformer.java +++ /dev/null @@ -1,99 +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.iotdb.db.queryengine.transformation.dag.column.ternary; - -import org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext; -import org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer; - -import org.apache.tsfile.block.column.Column; -import org.apache.tsfile.block.column.ColumnBuilder; -import org.apache.tsfile.read.common.type.Type; - -import java.util.Optional; - -import static org.apache.iotdb.db.queryengine.transformation.dag.column.unary.scalar.ReadObjectColumnTransformer.transform; - -public class ReadObject3ColumnTransformer extends TernaryColumnTransformer { - - private final Optional<FragmentInstanceContext> fragmentInstanceContext; - - public ReadObject3ColumnTransformer( - Type returnType, - ColumnTransformer firstColumnTransformer, - ColumnTransformer secondColumnTransformer, - ColumnTransformer thirdColumnTransformer, - Optional<FragmentInstanceContext> fragmentInstanceContext) { - super(returnType, firstColumnTransformer, secondColumnTransformer, thirdColumnTransformer); - this.fragmentInstanceContext = fragmentInstanceContext; - } - - @Override - protected void checkType() { - // do nothing - } - - @Override - protected void doTransform( - Column firstColumn, - Column secondColumn, - Column thirdColumn, - ColumnBuilder builder, - int positionCount) { - for (int i = 0; i < positionCount; i++) { - if (!firstColumn.isNull(i) && !secondColumn.isNull(i) && !thirdColumn.isNull(i)) { - transform( - firstColumn, - builder, - i, - secondColumn.getLong(i), - thirdColumn.getLong(i), - this.fragmentInstanceContext); - } else { - builder.appendNull(); - } - } - } - - @Override - protected void doTransform( - Column firstColumn, - Column secondColumn, - Column thirdColumn, - ColumnBuilder builder, - int positionCount, - boolean[] selection) { - for (int i = 0; i < positionCount; i++) { - if (selection[i] - && !firstColumn.isNull(i) - && !secondColumn.isNull(i) - && !thirdColumn.isNull(i)) { - transform( - firstColumn, - builder, - i, - secondColumn.getLong(i), - thirdColumn.getLong(i), - this.fragmentInstanceContext); - } else { - builder.appendNull(); - } - } - } -} diff --git a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/ReadObjectColumnTransformer.java b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/ReadObjectColumnTransformer.java deleted file mode 100644 index 33b32de2327..00000000000 --- a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/transformation/dag/column/unary/scalar/ReadObjectColumnTransformer.java +++ /dev/null @@ -1,126 +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.iotdb.db.queryengine.transformation.dag.column.unary.scalar; - -import org.apache.iotdb.db.queryengine.execution.fragment.FragmentInstanceContext; -import org.apache.iotdb.db.queryengine.transformation.dag.column.ColumnTransformer; -import org.apache.iotdb.db.queryengine.transformation.dag.column.unary.UnaryColumnTransformer; -import org.apache.iotdb.db.utils.ObjectTypeUtils; - -import org.apache.tsfile.block.column.Column; -import org.apache.tsfile.block.column.ColumnBuilder; -import org.apache.tsfile.enums.TSDataType; -import org.apache.tsfile.read.common.type.Type; -import org.apache.tsfile.utils.Binary; -import org.apache.tsfile.utils.Pair; - -import java.util.Optional; - -public class ReadObjectColumnTransformer extends UnaryColumnTransformer { - - private final Optional<FragmentInstanceContext> fragmentInstanceContext; - private long offset = 0; - private long length = -1; - - public ReadObjectColumnTransformer( - Type type, - ColumnTransformer childColumnTransformer, - Optional<FragmentInstanceContext> fragmentInstanceContext) { - super(type, childColumnTransformer); - this.fragmentInstanceContext = fragmentInstanceContext; - } - - public ReadObjectColumnTransformer( - Type type, - long offset, - ColumnTransformer childColumnTransformer, - Optional<FragmentInstanceContext> fragmentInstanceContext) { - super(type, childColumnTransformer); - this.offset = offset; - this.fragmentInstanceContext = fragmentInstanceContext; - } - - public ReadObjectColumnTransformer( - Type type, - long offset, - long length, - ColumnTransformer childColumnTransformer, - Optional<FragmentInstanceContext> fragmentInstanceContext) { - super(type, childColumnTransformer); - this.offset = offset; - this.length = length; - this.fragmentInstanceContext = fragmentInstanceContext; - } - - @Override - protected void doTransform(Column column, ColumnBuilder columnBuilder) { - for (int i = 0, n = column.getPositionCount(); i < n; i++) { - if (!column.isNull(i)) { - transform(column, columnBuilder, i, this.offset, this.length, this.fragmentInstanceContext); - } else { - columnBuilder.appendNull(); - } - } - } - - @Override - protected void doTransform(Column column, ColumnBuilder columnBuilder, boolean[] selection) { - for (int i = 0, n = column.getPositionCount(); i < n; i++) { - if (selection[i] && !column.isNull(i)) { - transform(column, columnBuilder, i, this.offset, this.length, this.fragmentInstanceContext); - } else { - columnBuilder.appendNull(); - } - } - } - - public static void transform( - Column column, - ColumnBuilder columnBuilder, - int i, - long offset, - long length, - Optional<FragmentInstanceContext> fragmentInstanceContext) { - // BinaryColumn.getDataType() returns TSDataType.TEXT - if (TSDataType.TEXT == column.getDataType()) { - Binary binary = column.getBinary(i); - columnBuilder.writeBinary(readObject(binary, offset, length, fragmentInstanceContext)); - } else { - throw new IllegalStateException("read_object function only accept a BinaryColumn."); - } - } - - public static Binary readObject( - Binary binary, - long offset, - long length, - Optional<FragmentInstanceContext> fragmentInstanceContext) { - Pair<Long, String> objectLengthPathPair = - ObjectTypeUtils.parseObjectBinaryToSizeStringPathPair(binary); - long fileLength = objectLengthPathPair.getLeft(); - String relativePath = objectLengthPathPair.getRight(); - int actualReadSize = - ObjectTypeUtils.getActualReadSize(relativePath, fileLength, offset, length); - fragmentInstanceContext.ifPresent( - context -> context.getMemoryReservationContext().reserveMemoryCumulatively(actualReadSize)); - return new Binary( - ObjectTypeUtils.readObjectContent(relativePath, offset, actualReadSize, true).array()); - } -} diff --git a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/relational/TableBuiltinScalarFunction.java b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/relational/TableBuiltinScalarFunction.java index 5d22ff58d81..e20ca4dd073 100644 --- a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/relational/TableBuiltinScalarFunction.java +++ b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/udf/builtin/relational/TableBuiltinScalarFunction.java @@ -111,7 +111,6 @@ public enum TableBuiltinScalarFunction { SPOOKY_HASH_V2_64("spooky_hash_v2_64"), LPAD("lpad"), RPAD("rpad"), - READ_OBJECT("read_object"), ; private final String functionName;
