/** * Full-fledged constructor. * * @param schemaName Schema name. * @param sql SQL. * @param fieldsQry Query with flags. * @param loc DML {@code SELECT} Locality flag. */ private H2CachedStatementKey(String schemaName, String sql, SqlFieldsQuery fieldsQry, boolean loc) { this.schemaName = schemaName; this.sql = sql; if (fieldsQry == null || loc || !UpdatePlanBuilder.isSkipReducerOnUpdateQuery(fieldsQry)) this.flags = 0; // flags only relevant for server side updates. else { this.flags = (byte)(1 + (fieldsQry.isDistributedJoins() ? 2 : 0) + (fieldsQry.isEnforceJoinOrder() ? 4 : 0) + (fieldsQry.isCollocated() ? 8 : 0)); } }
if (qry.isDistributedJoins() && qry.getPartitions() != null) throw new CacheException("Using both partitions and distributed JOINs is not supported for the same query");
fieldsQry.getArgs(), fieldsQry.isCollocated(), fieldsQry.isDistributedJoins(), fieldsQry.isEnforceJoinOrder(), idx.partitionExtractor());
/** * @param cache Cache. * @param qry Query. * @return Query plan. */ protected final String queryPlan(IgniteCache<?, ?> cache, SqlFieldsQuery qry) { return (String)cache.query(new SqlFieldsQuery("explain " + qry.getSql()) .setArgs(qry.getArgs()) .setLocal(qry.isLocal()) .setCollocated(qry.isCollocated()) .setPageSize(qry.getPageSize()) .setDistributedJoins(qry.isDistributedJoins()) .setEnforceJoinOrder(qry.isEnforceJoinOrder())) .getAll().get(0).get(0); }
/** Serialize SQL field query to stream. */ void write(SqlFieldsQuery qry, BinaryOutputStream out) { writeObject(out, qry.getSchema()); out.writeInt(qry.getPageSize()); out.writeInt(-1); // do not limit writeObject(out, qry.getSql()); ClientUtils.collection(qry.getArgs() == null ? null : Arrays.asList(qry.getArgs()), out, this::writeObject); out.writeByte((byte)0); // statement type ANY out.writeBoolean(qry.isDistributedJoins()); out.writeBoolean(qry.isLocal()); out.writeBoolean(qry.isReplicatedOnly()); out.writeBoolean(qry.isEnforceJoinOrder()); out.writeBoolean(qry.isCollocated()); out.writeBoolean(qry.isLazy()); out.writeLong(qry.getTimeout()); out.writeBoolean(true); // include column names }
qry.getArgs(), qry.isCollocated(), qry.isDistributedJoins(), qry.isEnforceJoinOrder(), partExtractor);
qry.isCollocated(), qry.isDistributedJoins(), qry.isEnforceJoinOrder(), qry.isLocal());
qry.isCollocated(), qry.isDistributedJoins(), qry.isEnforceJoinOrder(), qry.isLocal()); .distributedJoinMode(distributedJoinMode(qry.isLocal(), qry.isDistributedJoins())));
SqlFieldsQuery newFieldsQry = new SqlFieldsQuery(plan.selectQuery(), qry.isCollocated()) .setArgs(qry.getArgs()) .setDistributedJoins(qry.isDistributedJoins()) .setEnforceJoinOrder(qry.isEnforceJoinOrder()) .setLocal(qry.isLocal())
.setDistributedJoins(fieldsQry.isDistributedJoins()) .setEnforceJoinOrder(fieldsQry.isEnforceJoinOrder()) .setLocal(fieldsQry.isLocal()) .setDistributedJoins(fieldsQry.isDistributedJoins()) .setEnforceJoinOrder(fieldsQry.isEnforceJoinOrder()) .setLocal(fieldsQry.isLocal())
/** * Full-fledged constructor. * * @param schemaName Schema name. * @param sql SQL. * @param fieldsQry Query with flags. * @param loc DML {@code SELECT} Locality flag. */ private H2CachedStatementKey(String schemaName, String sql, SqlFieldsQuery fieldsQry, boolean loc) { this.schemaName = schemaName; this.sql = sql; if (fieldsQry == null || loc || !UpdatePlanBuilder.isSkipReducerOnUpdateQuery(fieldsQry)) this.flags = 0; // flags only relevant for server side updates. else { this.flags = (byte)(1 + (fieldsQry.isDistributedJoins() ? 2 : 0) + (fieldsQry.isEnforceJoinOrder() ? 4 : 0) + (fieldsQry.isCollocated() ? 8 : 0)); } }
/** * Validate SQL fields query. * * @param qry Query. * @param ctx Kernal context. * @param cctx Cache context. */ private static void validateSqlFieldsQuery(SqlFieldsQuery qry, GridKernalContext ctx, @Nullable GridCacheContext<?, ?> cctx) { if (qry.isReplicatedOnly() && qry.getPartitions() != null) throw new CacheException("Partitions are not supported in replicated only mode."); if (qry.isDistributedJoins() && qry.getPartitions() != null) throw new CacheException("Using both partitions and distributed JOINs is not supported for the same query"); if (qry.isLocal() && ctx.clientNode() && (cctx == null || cctx.config().getCacheMode() != CacheMode.LOCAL)) throw new CacheException("Execution of local SqlFieldsQuery on client node disallowed."); }
fieldsQry.getArgs(), fieldsQry.isCollocated(), fieldsQry.isDistributedJoins(), fieldsQry.isEnforceJoinOrder(), idx);
/** Serialize SQL field query to stream. */ void write(SqlFieldsQuery qry, BinaryOutputStream out) { writeObject(out, qry.getSchema()); out.writeInt(qry.getPageSize()); out.writeInt(-1); // do not limit writeObject(out, qry.getSql()); ClientUtils.collection(qry.getArgs() == null ? null : Arrays.asList(qry.getArgs()), out, this::writeObject); out.writeByte((byte)0); // statement type ANY out.writeBoolean(qry.isDistributedJoins()); out.writeBoolean(qry.isLocal()); out.writeBoolean(qry.isReplicatedOnly()); out.writeBoolean(qry.isEnforceJoinOrder()); out.writeBoolean(qry.isCollocated()); out.writeBoolean(qry.isLazy()); out.writeLong(qry.getTimeout()); out.writeBoolean(true); // include column names }
/** * Split query into two-step query. * @param prepared JDBC prepared statement. * @param qry Original fields query. * @return Two-step query. * @throws IgniteCheckedException in case of error inside {@link GridSqlQuerySplitter}. * @throws SQLException in case of error inside {@link GridSqlQuerySplitter}. */ private GridCacheTwoStepQuery split(Prepared prepared, SqlFieldsQuery qry) throws IgniteCheckedException, SQLException { GridCacheTwoStepQuery res = GridSqlQuerySplitter.split(connectionForThread(qry.getSchema()), prepared, qry.getArgs(), qry.isCollocated(), qry.isDistributedJoins(), qry.isEnforceJoinOrder(), this); List<Integer> cacheIds = collectCacheIds(null, res); if (!F.isEmpty(cacheIds) && hasSystemViews(res)) { throw new IgniteSQLException("Normal tables and system views cannot be used in the same query.", IgniteQueryErrorCode.UNSUPPORTED_OPERATION); } if (F.isEmpty(cacheIds)) res.local(true); else { res.cacheIds(cacheIds); res.local(qry.isLocal()); } res.pageSize(qry.getPageSize()); return res; }
qry.isCollocated(), qry.isDistributedJoins(), qry.isEnforceJoinOrder(), qry.isLocal());
qry.isCollocated(), qry.isDistributedJoins(), qry.isEnforceJoinOrder(), qry.isLocal()); .distributedJoinMode(distributedJoinMode(qry.isLocal(), qry.isDistributedJoins())));
SqlFieldsQuery newFieldsQry = new SqlFieldsQuery(plan.selectQuery(), qry.isCollocated()) .setArgs(qry.getArgs()) .setDistributedJoins(qry.isDistributedJoins()) .setEnforceJoinOrder(qry.isEnforceJoinOrder()) .setLocal(qry.isLocal())
.setDistributedJoins(fieldsQry.isDistributedJoins()) .setEnforceJoinOrder(fieldsQry.isEnforceJoinOrder()) .setLocal(fieldsQry.isLocal()) .setDistributedJoins(fieldsQry.isDistributedJoins()) .setEnforceJoinOrder(fieldsQry.isEnforceJoinOrder()) .setLocal(fieldsQry.isLocal())