This is an automated email from the ASF dual-hosted git repository.
alexpl pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git
The following commit(s) were added to refs/heads/master by this push:
new f016170b30e IGNITE-27105 SQL: Add JDBC local query property - Fixes
#12519.
f016170b30e is described below
commit f016170b30ef4acdae638c9f965064cbff53bf54
Author: Aleksey Plekhanov <[email protected]>
AuthorDate: Fri Nov 21 10:25:17 2025 +0300
IGNITE-27105 SQL: Add JDBC local query property - Fixes #12519.
Signed-off-by: Aleksey Plekhanov <[email protected]>
---
.../query/calcite/jdbc/AbstractJdbcTest.java | 70 ++++++++++++++++++++
.../query/calcite/jdbc/JdbcCrossEngineTest.java | 42 +-----------
.../query/calcite/jdbc/JdbcLocalFlagTest.java | 76 ++++++++++++++++++++++
.../ignite/testsuites/IgniteCalciteTestSuite.java | 8 +--
.../ignite/testsuites/IntegrationTestSuite.java | 4 --
...iteCalciteTestSuite.java => JdbcTestSuite.java} | 36 +++-------
.../jdbc/thin/JdbcThinDataSourceSelfTest.java | 8 ++-
.../apache/ignite/IgniteJdbcThinDataSource.java | 14 ++++
.../internal/jdbc/thin/ConnectionProperties.java | 10 +++
.../jdbc/thin/ConnectionPropertiesImpl.java | 16 ++++-
.../internal/jdbc/thin/JdbcThinConnection.java | 8 +++
.../ignite/internal/jdbc/thin/JdbcThinTcpIo.java | 7 +-
.../odbc/jdbc/JdbcConnectionContext.java | 4 +-
.../processors/odbc/jdbc/JdbcRequestHandler.java | 4 ++
.../processors/odbc/jdbc/JdbcThinFeature.java | 5 +-
.../processors/odbc/odbc/OdbcRequestHandler.java | 1 +
.../processors/query/SqlClientContext.java | 13 ++++
17 files changed, 243 insertions(+), 83 deletions(-)
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/AbstractJdbcTest.java
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/AbstractJdbcTest.java
new file mode 100644
index 00000000000..0f956beb5ee
--- /dev/null
+++
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/AbstractJdbcTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.ignite.internal.processors.query.calcite.jdbc;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.List;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * Abstract JDBC test.
+ */
+public abstract class AbstractJdbcTest extends GridCommonAbstractTest {
+ /** URL. */
+ protected static final String URL = "jdbc:ignite:thin://127.0.0.1";
+
+ /** */
+ protected void execute(Statement stmt, String sql) {
+ try {
+ stmt.execute(sql);
+ }
+ catch (SQLException e) {
+ throw new IgniteException(e.getMessage(), e);
+ }
+ }
+
+ /** */
+ protected List<List<Object>> executeQuery(Connection conn, String sql)
throws SQLException {
+ return executeQuery(conn.createStatement(), sql);
+ }
+
+ /** */
+ protected List<List<Object>> executeQuery(Statement stmt, String sql) {
+ try (ResultSet rs = stmt.executeQuery(sql)) {
+ List<List<Object>> res = new ArrayList<>();
+ while (rs.next()) {
+ List<Object> row = new ArrayList<>();
+
+ for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
+ row.add(rs.getObject(i));
+
+ res.add(row);
+ }
+
+ return res;
+ }
+ catch (SQLException e) {
+ throw new IgniteException(e.getMessage(), e);
+ }
+ }
+}
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcCrossEngineTest.java
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcCrossEngineTest.java
index 5b959edc3e5..3eee08e82a3 100644
---
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcCrossEngineTest.java
+++
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcCrossEngineTest.java
@@ -21,31 +21,23 @@ import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
-import java.sql.ResultSet;
-import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
-import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import java.util.function.IntConsumer;
-import org.apache.ignite.IgniteException;
import org.apache.ignite.calcite.CalciteQueryEngineConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.configuration.SqlConfiguration;
import org.apache.ignite.indexing.IndexingQueryEngineConfiguration;
-import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
import org.junit.Test;
/**
* Cross check queries on experimental and non-experimental SQL engines.
*/
-public class JdbcCrossEngineTest extends GridCommonAbstractTest {
- /** URL. */
- private static final String url = "jdbc:ignite:thin://127.0.0.1";
-
+public class JdbcCrossEngineTest extends AbstractJdbcTest {
/** Nodes count. */
private static final int nodesCnt = 3;
@@ -76,7 +68,7 @@ public class JdbcCrossEngineTest extends
GridCommonAbstractTest {
startGrids(nodesCnt);
for (int i = 0; i < engineNames.length; i++) {
- conns[i] = DriverManager.getConnection(url + "?queryEngine=" +
engineNames[i]);
+ conns[i] = DriverManager.getConnection(URL + "?queryEngine=" +
engineNames[i]);
conns[i].setSchema("PUBLIC");
stmts[i] = conns[i].createStatement();
@@ -203,36 +195,6 @@ public class JdbcCrossEngineTest extends
GridCommonAbstractTest {
);
}
- /** */
- private void execute(Statement stmt, String sql) {
- try {
- stmt.execute(sql);
- }
- catch (SQLException e) {
- throw new IgniteException(e.getMessage(), e);
- }
- }
-
- /** */
- private List<List<Object>> executeQuery(Statement stmt, String sql) {
- try (ResultSet rs = stmt.executeQuery(sql)) {
- List<List<Object>> res = new ArrayList<>();
- while (rs.next()) {
- List<Object> row = new ArrayList<>();
-
- for (int i = 1; i <= rs.getMetaData().getColumnCount(); i++)
- row.add(rs.getObject(i));
-
- res.add(row);
- }
-
- return res;
- }
- catch (SQLException e) {
- throw new IgniteException(e.getMessage(), e);
- }
- }
-
/** */
private void crossCheck(IntConsumer consumer1, IntConsumer consumer2) {
// Execute consumer1 on indexing engine, consumer2 on calcite engine.
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcLocalFlagTest.java
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcLocalFlagTest.java
new file mode 100644
index 00000000000..687de37a8a2
--- /dev/null
+++
b/modules/calcite/src/test/java/org/apache/ignite/internal/processors/query/calcite/jdbc/JdbcLocalFlagTest.java
@@ -0,0 +1,76 @@
+/*
+ * 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.ignite.internal.processors.query.calcite.jdbc;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.List;
+import org.apache.ignite.cache.query.SqlFieldsQuery;
+import org.apache.ignite.calcite.CalciteQueryEngineConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.SqlConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.junit.Test;
+
+/** */
+public class JdbcLocalFlagTest extends AbstractJdbcTest {
+ /** {@inheritDoc} */
+ @Override protected IgniteConfiguration getConfiguration(String
instanceName) throws Exception {
+ IgniteConfiguration cfg = super.getConfiguration(instanceName);
+
+ cfg.setSqlConfiguration(new SqlConfiguration()
+ .setQueryEnginesConfiguration(new
CalciteQueryEngineConfiguration().setDefault(true)));
+
+ return cfg;
+ }
+
+ /** {@inheritDoc} */
+ @Override protected void afterTest() {
+ stopAllGrids();
+ }
+
+ /** */
+ @Test
+ public void testLocalFlag() throws Exception {
+ IgniteEx ignite = startGrids(3);
+
+ int keys = 100;
+
+ sql(ignite, "CREATE TABLE test(id INT PRIMARY KEY, val VARCHAR)");
+
+ for (int i = 0; i < keys; i++)
+ sql(ignite, "INSERT INTO test(id, val) VALUES (?, ?)", i, "val" +
i);
+
+ try (Connection conn = DriverManager.getConnection(URL)) {
+ List<List<Object>> res = executeQuery(conn, "SELECT * FROM test");
+
+ assertEquals(keys, res.size());
+ }
+
+ try (Connection conn = DriverManager.getConnection(URL +
"?local=true")) {
+ List<List<Object>> res = executeQuery(conn, "SELECT * FROM test");
+
+ assertTrue(keys > res.size());
+ }
+ }
+
+ /** */
+ private List<List<?>> sql(IgniteEx ignite, String sql, Object... args) {
+ return ignite.context().query().querySqlFields(new
SqlFieldsQuery(sql).setArgs(args), false).getAll();
+ }
+}
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IgniteCalciteTestSuite.java
b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IgniteCalciteTestSuite.java
index b9f1914f9e1..72fd3786d99 100644
---
a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IgniteCalciteTestSuite.java
+++
b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IgniteCalciteTestSuite.java
@@ -19,9 +19,6 @@ package org.apache.ignite.testsuites;
import
org.apache.ignite.internal.processors.query.calcite.exec.LogicalRelImplementorTest;
import
org.apache.ignite.internal.processors.query.calcite.exec.NumericTypesPrecisionsTest;
-import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcConnectionEnabledPropertyTest;
-import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcSetClientInfoTest;
-import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcThinTransactionalSelfTest;
import
org.apache.ignite.internal.processors.query.calcite.message.CalciteCommunicationMessageSerializationTest;
import
org.apache.ignite.internal.processors.query.calcite.sql.SqlCustomParserTest;
import
org.apache.ignite.internal.processors.query.calcite.sql.SqlReservedWordsTest;
@@ -39,6 +36,7 @@ import org.junit.runners.Suite;
ExecutionTestSuite.class,
IntegrationTestSuite.class,
UtilTestSuite.class,
+ JdbcTestSuite.class,
SqlCustomParserTest.class,
SqlReservedWordsTest.class,
@@ -51,10 +49,6 @@ import org.junit.runners.Suite;
SqlTransactionsIsolationTest.class,
SqlTransactionsUnsupportedModesTest.class,
-
- JdbcThinTransactionalSelfTest.class,
- JdbcSetClientInfoTest.class,
- JdbcConnectionEnabledPropertyTest.class
})
public class IgniteCalciteTestSuite {
}
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java
b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java
index 2754c4bc417..47f7480afab 100644
---
a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java
+++
b/modules/calcite/src/test/java/org/apache/ignite/testsuites/IntegrationTestSuite.java
@@ -85,8 +85,6 @@ import
org.apache.ignite.internal.processors.query.calcite.integration.ViewsInte
import
org.apache.ignite.internal.processors.query.calcite.integration.tpch.TpchScale001Test;
import
org.apache.ignite.internal.processors.query.calcite.integration.tpch.TpchScale010Test;
import
org.apache.ignite.internal.processors.query.calcite.integration.tpch.TpchScale100Test;
-import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcCrossEngineTest;
-import org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcQueryTest;
import
org.apache.ignite.internal.processors.query.calcite.rules.JoinCommuteRulesTest;
import
org.apache.ignite.internal.processors.query.calcite.rules.JoinOrderOptimizationTest;
import
org.apache.ignite.internal.processors.query.calcite.rules.OrToUnionRuleTest;
@@ -104,8 +102,6 @@ import org.junit.runners.Suite;
ProjectScanMergeRuleTest.class,
CalciteQueryProcessorTest.class,
CalciteErrorHandlilngIntegrationTest.class,
- JdbcQueryTest.class,
- JdbcCrossEngineTest.class,
CalciteBasicSecondaryIndexIntegrationTest.class,
CancelTest.class,
DateTimeTest.class,
diff --git
a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IgniteCalciteTestSuite.java
b/modules/calcite/src/test/java/org/apache/ignite/testsuites/JdbcTestSuite.java
similarity index 53%
copy from
modules/calcite/src/test/java/org/apache/ignite/testsuites/IgniteCalciteTestSuite.java
copy to
modules/calcite/src/test/java/org/apache/ignite/testsuites/JdbcTestSuite.java
index b9f1914f9e1..1e9a8c4f2e4 100644
---
a/modules/calcite/src/test/java/org/apache/ignite/testsuites/IgniteCalciteTestSuite.java
+++
b/modules/calcite/src/test/java/org/apache/ignite/testsuites/JdbcTestSuite.java
@@ -17,44 +17,26 @@
package org.apache.ignite.testsuites;
-import
org.apache.ignite.internal.processors.query.calcite.exec.LogicalRelImplementorTest;
-import
org.apache.ignite.internal.processors.query.calcite.exec.NumericTypesPrecisionsTest;
import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcConnectionEnabledPropertyTest;
+import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcCrossEngineTest;
+import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcLocalFlagTest;
+import org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcQueryTest;
import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcSetClientInfoTest;
import
org.apache.ignite.internal.processors.query.calcite.jdbc.JdbcThinTransactionalSelfTest;
-import
org.apache.ignite.internal.processors.query.calcite.message.CalciteCommunicationMessageSerializationTest;
-import
org.apache.ignite.internal.processors.query.calcite.sql.SqlCustomParserTest;
-import
org.apache.ignite.internal.processors.query.calcite.sql.SqlReservedWordsTest;
-import org.apache.ignite.internal.processors.tx.SqlTransactionsIsolationTest;
-import
org.apache.ignite.internal.processors.tx.SqlTransactionsUnsupportedModesTest;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
/**
- * Calcite tests.
+ * Calcite JDBC tests.
*/
@RunWith(Suite.class)
@Suite.SuiteClasses({
- PlannerTestSuite.class,
- ExecutionTestSuite.class,
- IntegrationTestSuite.class,
- UtilTestSuite.class,
-
- SqlCustomParserTest.class,
- SqlReservedWordsTest.class,
- LogicalRelImplementorTest.class,
-
- ScriptTestSuite.class,
- CalciteCommunicationMessageSerializationTest.class,
-
- NumericTypesPrecisionsTest.class,
-
- SqlTransactionsIsolationTest.class,
- SqlTransactionsUnsupportedModesTest.class,
-
+ JdbcQueryTest.class,
+ JdbcCrossEngineTest.class,
JdbcThinTransactionalSelfTest.class,
JdbcSetClientInfoTest.class,
- JdbcConnectionEnabledPropertyTest.class
+ JdbcConnectionEnabledPropertyTest.class,
+ JdbcLocalFlagTest.class,
})
-public class IgniteCalciteTestSuite {
+public class JdbcTestSuite {
}
diff --git
a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDataSourceSelfTest.java
b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDataSourceSelfTest.java
index 88ba966172b..1986e8b84cb 100644
---
a/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDataSourceSelfTest.java
+++
b/modules/clients/src/test/java/org/apache/ignite/jdbc/thin/JdbcThinDataSourceSelfTest.java
@@ -52,7 +52,6 @@ import static
org.apache.ignite.cache.query.SqlFieldsQuery.DFLT_LAZY;
@SuppressWarnings("ThrowableNotThrown")
public class JdbcThinDataSourceSelfTest extends JdbcThinAbstractSelfTest {
/** {@inheritDoc} */
- @SuppressWarnings("deprecation")
@Override protected IgniteConfiguration getConfiguration(String
igniteInstanceName) throws Exception {
IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
@@ -141,6 +140,10 @@ public class JdbcThinDataSourceSelfTest extends
JdbcThinAbstractSelfTest {
assertNull(ids.getSchema());
assertEquals(DFLT_LAZY, ids.isLazy());
assertTrue(ids.isCollocated());
+
+ ids.setUrl("jdbc:ignite:thin://127.0.0.1:10800?local=true");
+
+ assertTrue(ids.isLocal());
}
/**
@@ -161,6 +164,7 @@ public class JdbcThinDataSourceSelfTest extends
JdbcThinAbstractSelfTest {
assertEquals(DFLT_LAZY, io.connectionProperties().isLazy());
assertFalse(io.connectionProperties().isDistributedJoins());
assertFalse(io.connectionProperties().isReplicatedOnly());
+ assertFalse(io.connectionProperties().isLocal());
}
}
@@ -170,6 +174,7 @@ public class JdbcThinDataSourceSelfTest extends
JdbcThinAbstractSelfTest {
ids.setLazy(!DFLT_LAZY);
ids.setDistributedJoins(true);
ids.setReplicatedOnly(true);
+ ids.setLocal(true);
try (Connection conn = ids.getConnection()) {
@@ -180,6 +185,7 @@ public class JdbcThinDataSourceSelfTest extends
JdbcThinAbstractSelfTest {
assertEquals(!DFLT_LAZY, io.connectionProperties().isLazy());
assertTrue(io.connectionProperties().isDistributedJoins());
assertTrue(io.connectionProperties().isReplicatedOnly());
+ assertTrue(io.connectionProperties().isLocal());
}
}
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/IgniteJdbcThinDataSource.java
b/modules/core/src/main/java/org/apache/ignite/IgniteJdbcThinDataSource.java
index 7323471dd17..35302031940 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteJdbcThinDataSource.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteJdbcThinDataSource.java
@@ -325,6 +325,20 @@ public class IgniteJdbcThinDataSource implements
DataSource, Serializable {
props.setLazy(lazy);
}
+ /**
+ * @return Local query flag.
+ */
+ public boolean isLocal() {
+ return props.isLocal();
+ }
+
+ /**
+ * @param loc Local query flag.
+ */
+ public void setLocal(boolean loc) {
+ props.setLocal(loc);
+ }
+
/**
* @return Skip reducer on update flag.
*/
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionProperties.java
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionProperties.java
index 30b8809ab80..34e829be444 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionProperties.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionProperties.java
@@ -597,4 +597,14 @@ public interface ConnectionProperties {
* @param transactionLabel Transaction label.
*/
public void setTransactionLabel(String transactionLabel);
+
+ /**
+ * @return Local flag.
+ */
+ public boolean isLocal();
+
+ /**
+ * @param loc Local flag.
+ */
+ public void setLocal(boolean loc);
}
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java
index 0b933d4261d..a0f84fa74c8 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/ConnectionPropertiesImpl.java
@@ -76,6 +76,10 @@ public class ConnectionPropertiesImpl implements
ConnectionProperties, Serializa
private final BooleanProperty replicatedOnly = new BooleanProperty(
"replicatedOnly", "Specify if the all queries contain only replicated
tables", false, false);
+ /** Local query property. */
+ private final BooleanProperty loc = new BooleanProperty(
+ "local", "Whether this query should be executed on local node only",
false, false);
+
/** Auto close server cursor property. */
private final BooleanProperty autoCloseServerCursor = new BooleanProperty(
"autoCloseServerCursor", "Enable auto close server cursors when last
piece of result set is retrieved. " +
@@ -268,7 +272,7 @@ public class ConnectionPropertiesImpl implements
ConnectionProperties, Serializa
/** Properties array. */
private final ConnectionProperty[] propsArr = {
distributedJoins, enforceJoinOrder, collocated, replicatedOnly,
autoCloseServerCursor,
- tcpNoDelay, lazy, socketSendBuffer, socketReceiveBuffer,
skipReducerOnUpdate,
+ tcpNoDelay, lazy, loc, socketSendBuffer, socketReceiveBuffer,
skipReducerOnUpdate,
sslMode, sslCipherSuites, sslProtocol, sslKeyAlgorithm,
sslClientCertificateKeyStoreUrl, sslClientCertificateKeyStorePassword,
sslClientCertificateKeyStoreType,
sslTrustCertificateKeyStoreUrl, sslTrustCertificateKeyStorePassword,
sslTrustCertificateKeyStoreType,
@@ -726,6 +730,16 @@ public class ConnectionPropertiesImpl implements
ConnectionProperties, Serializa
this.transactionLabel.setValue(transactionLabel);
}
+ /** {@inheritDoc} */
+ @Override public boolean isLocal() {
+ return loc.value();
+ }
+
+ /** {@inheritDoc} */
+ @Override public void setLocal(boolean loc) {
+ this.loc.setValue(loc);
+ }
+
/**
* @param url URL connection.
* @param props Environment properties.
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
index 1ce478c7c86..ac5314a9772 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinConnection.java
@@ -317,6 +317,14 @@ public class JdbcThinConnection implements Connection {
holdability = isTxAwareQueriesSupported ? CLOSE_CURSORS_AT_COMMIT :
HOLD_CURSORS_OVER_COMMIT;
txIsolation = defaultTransactionIsolation();
+
+ if (connProps.isLocal()) {
+ if (connProps.getAddresses().length != 1
+ || connProps.getAddresses()[0].portFrom() !=
connProps.getAddresses()[0].portTo()) {
+ LOG.warning("Local flag is supposed to be used only when
exactly one address is specified, " +
+ "otherwise the local query may be executed on an
unexpected node");
+ }
+ }
}
/** Create new binary context. */
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
index 330affaf773..e1f1cf88c76 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/jdbc/thin/JdbcThinTcpIo.java
@@ -319,7 +319,12 @@ public class JdbcThinTcpIo {
}
}
-
writer.writeByteArray(ThinProtocolFeature.featuresAsBytes(enabledFeatures()));
+ EnumSet<JdbcThinFeature> enabledFeatures = enabledFeatures();
+
+ if (!connProps.isLocal())
+ enabledFeatures.remove(JdbcThinFeature.LOCAL_QUERIES);
+
+
writer.writeByteArray(ThinProtocolFeature.featuresAsBytes(enabledFeatures));
}
if (ver.compareTo(VER_2_13_0) >= 0)
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcConnectionContext.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcConnectionContext.java
index 47a94f37d4d..dc64906d18a 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcConnectionContext.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcConnectionContext.java
@@ -279,8 +279,10 @@ public class JdbcConnectionContext extends
ClientListenerAbstractConnectionConte
}
};
+ boolean loc = features.contains(JdbcThinFeature.LOCAL_QUERIES);
+
handler = new JdbcRequestHandler(busyLock, snd, maxCursors,
distributedJoins, enforceJoinOrder,
- collocated, replicatedOnly, autoCloseCursors, lazyExec,
skipReducerOnUpdate, qryEngine,
+ collocated, replicatedOnly, autoCloseCursors, lazyExec, loc,
skipReducerOnUpdate, qryEngine,
dataPageScanEnabled, updateBatchSize,
concurrency, isolation, timeout, lb,
ver, this);
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java
index cd5d9087062..3a4a8091183 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcRequestHandler.java
@@ -181,6 +181,7 @@ public class JdbcRequestHandler implements
ClientListenerRequestHandler, ClientT
* @param replicatedOnly Replicated only flag.
* @param autoCloseCursors Flag to automatically close server cursors.
* @param lazy Lazy query execution flag.
+ * @param loc Local query flag.
* @param skipReducerOnUpdate Skip reducer on update flag.
* @param qryEngine Name of SQL query engine to use.
* @param dataPageScanEnabled Enable scan data page mode.
@@ -202,6 +203,7 @@ public class JdbcRequestHandler implements
ClientListenerRequestHandler, ClientT
boolean replicatedOnly,
boolean autoCloseCursors,
boolean lazy,
+ boolean loc,
boolean skipReducerOnUpdate,
@Nullable String qryEngine,
@Nullable Boolean dataPageScanEnabled,
@@ -232,6 +234,7 @@ public class JdbcRequestHandler implements
ClientListenerRequestHandler, ClientT
collocated,
replicatedOnly,
lazy,
+ loc,
skipReducerOnUpdate,
dataPageScanEnabled,
updateBatchSize,
@@ -1118,6 +1121,7 @@ public class JdbcRequestHandler implements
ClientListenerRequestHandler, ClientT
qry.setCollocated(cliCtx.isCollocated());
qry.setReplicatedOnly(cliCtx.isReplicatedOnly());
qry.setLazy(cliCtx.isLazy());
+ qry.setLocal(cliCtx.isLocal());
qry.setSchema(schemaName);
qry.setQueryInitiatorId(connCtx.clientDescriptor());
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcThinFeature.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcThinFeature.java
index f4cd046fbd6..f531b72bdee 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcThinFeature.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/jdbc/JdbcThinFeature.java
@@ -40,7 +40,10 @@ public enum JdbcThinFeature implements ThinProtocolFeature {
TX_AWARE_QUERIES(4),
/** Send {@link Connection#setClientInfo(String, String)} with messages. */
- CLIENT_INFO(5);
+ CLIENT_INFO(5),
+
+ /** Execute local queries. */
+ LOCAL_QUERIES(6);
/** */
private static final EnumSet<JdbcThinFeature> ALL_FEATURES_AS_ENUM_SET =
EnumSet.allOf(JdbcThinFeature.class);
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
index eada467a534..2b9c87a6fa4 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/odbc/odbc/OdbcRequestHandler.java
@@ -162,6 +162,7 @@ public class OdbcRequestHandler implements
ClientListenerRequestHandler {
collocated,
replicatedOnly,
lazy,
+ false,
skipReducerOnUpdate,
null,
null,
diff --git
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/SqlClientContext.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/SqlClientContext.java
index 0e45c6177bc..481ea3674c8 100644
---
a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/SqlClientContext.java
+++
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/SqlClientContext.java
@@ -57,6 +57,9 @@ public class SqlClientContext implements AutoCloseable {
/** Lazy query execution flag. */
private final boolean lazy;
+ /** Local query flag. */
+ private final boolean loc;
+
/** Skip reducer on update flag. */
private final boolean skipReducerOnUpdate;
@@ -126,6 +129,7 @@ public class SqlClientContext implements AutoCloseable {
* @param collocated Collocated flag.
* @param replicatedOnly Replicated caches only flag.
* @param lazy Lazy query execution flag.
+ * @param loc Local query flag.
* @param skipReducerOnUpdate Skip reducer on update flag.
* @param dataPageScanEnabled Enable scan data page mode.
* @param updateBatchSize Size of internal batch for DML queries.
@@ -142,6 +146,7 @@ public class SqlClientContext implements AutoCloseable {
boolean collocated,
boolean replicatedOnly,
boolean lazy,
+ boolean loc,
boolean skipReducerOnUpdate,
@Nullable Boolean dataPageScanEnabled,
@Nullable Integer updateBatchSize,
@@ -158,6 +163,7 @@ public class SqlClientContext implements AutoCloseable {
this.collocated = collocated;
this.replicatedOnly = replicatedOnly;
this.lazy = lazy;
+ this.loc = loc;
this.skipReducerOnUpdate = skipReducerOnUpdate;
this.dataPageScanEnabled = dataPageScanEnabled;
this.updateBatchSize = updateBatchSize;
@@ -261,6 +267,13 @@ public class SqlClientContext implements AutoCloseable {
return lazy;
}
+ /**
+ * @return Local query flag.
+ */
+ public boolean isLocal() {
+ return loc;
+ }
+
/**
* @return Skip reducer on update flag,
*/