/** * Formats error message with query details. * * @param msg Error message. * @param qry Query. * @return Result. */ private String getError(String msg, SqlFieldsQuery qry) { return msg + " [qry='" + qry.getSql() + "', params=" + Arrays.deepToString(qry.getArgs()) + ']'; } }
if (!INTERNAL_CMD_RE.matcher(qry.getSql().trim()).find()) return null; SqlParser parser = new SqlParser(schemaName, qry.getSql()); log.debug("Failed to parse SQL with native parser [qry=" + qry.getSql() + ", err=" + e + ']'); code = ((SqlParseException)e).code(); throw new IgniteSQLException("Failed to parse DDL statement: " + qry.getSql() + ": " + e.getMessage(), code, e);
return Collections.singletonList(dmlProc.runNativeDmlStatement(schemaName, qry.getSql(), cmd)); Long qryId = registerRunningQuery(schemaName, null, qry.getSql(), qry.isLocal(), true); || cmd instanceof SqlAlterUserCommand || cmd instanceof SqlDropUserCommand) return Collections.singletonList(ddlProc.runDdlStatement(qry.getSql(), cmd)); else if (cmd instanceof SqlSetStreamingCommand) { if (cliCtx == null) fail = true; throw new IgniteSQLException("Failed to execute DDL statement [stmt=" + qry.getSql() + ", err=" + e.getMessage() + ']', e);
/** * Run DML request from other node. * * @param schemaName Schema name. * @param fldsQry Query. * @param filter Filter. * @param cancel Cancel state. * @param local Locality flag. * @return Update result. * @throws IgniteCheckedException if failed. */ public UpdateResult mapDistributedUpdate(String schemaName, SqlFieldsQuery fldsQry, IndexingQueryFilter filter, GridQueryCancel cancel, boolean local) throws IgniteCheckedException { Connection conn = connMgr.connectionForThread().connection(schemaName); H2Utils.setupConnection(conn, false, fldsQry.isEnforceJoinOrder()); PreparedStatement stmt = preparedStatementWithParams(conn, fldsQry.getSql(), Arrays.asList(fldsQry.getArgs()), true); return dmlProc.mapDistributedUpdate(schemaName, stmt, fldsQry, filter, cancel, local); }
/** * Run DML on remote nodes. * * @param schemaName Schema name. * @param fieldsQry Initial update query. * @param cacheIds Cache identifiers. * @param isReplicatedOnly Whether query uses only replicated caches. * @param cancel Cancel state. * @return Update result. */ UpdateResult runDistributedUpdate( String schemaName, SqlFieldsQuery fieldsQry, List<Integer> cacheIds, boolean isReplicatedOnly, GridQueryCancel cancel) { return rdcQryExec.update(schemaName, cacheIds, fieldsQry.getSql(), fieldsQry.getArgs(), fieldsQry.isEnforceJoinOrder(), fieldsQry.getPageSize(), fieldsQry.getTimeout(), fieldsQry.getPartitions(), isReplicatedOnly, cancel); }
return executeQuery(qryType, qry.getSql(), cctx, clo, true); });
SqlFieldsQuery qry, GridCacheTwoStepQuery twoStepQry, List<GridQueryFieldMetadata> meta, boolean keepBinary, boolean startTx, MvccQueryTracker tracker, GridQueryCancel cancel, boolean registerAsNewQry) { String sqlQry = qry.getSql();
H2TwoStepCachedQueryKey cachedQryKey = new H2TwoStepCachedQueryKey(schemaName, qry.getSql(), qry.isCollocated(), qry.isDistributedJoins(), qry.isEnforceJoinOrder(), qry.isLocal()); if ((cachedStmt = cachedStatement(connMgr.connectionForThread().connection(schemaName), qry.getSql())) != null) { Prepared prepared = GridSqlQueryParser.prepared(cachedStmt); String remainingSql = qry.getSql(); remainingSql != qry.getSql() ? cloneFieldsQuery(qry).setSql(remainingSql) : qry, firstArg);
/** * Execute query from node. * * @param qry query. * @param node node to use to perform query. * @return Result of query. */ protected final Result executeFrom(SqlFieldsQuery qry, Ignite node) { if (explain) { try { SqlFieldsQuery explainQry = new SqlFieldsQuery(qry).setSql("EXPLAIN " + qry.getSql()); List<List<?>> res = ((IgniteEx)node).context().query().querySqlFields(explainQry, false).getAll(); String explanation = (String)res.get(0).get(0); log.debug("Node: " + node.name() + ": Execution plan for query " + qry + ":\n" + explanation); } catch (Exception exc) { log.error("Ignoring exception gotten explaining query : " + qry, exc); } } FieldsQueryCursor<List<?>> cursor = ((IgniteEx)node).context().query().querySqlFields(qry, false); return Result.fromCursor(cursor); }
/** * @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 }
/** {@inheritDoc} */ @Override public FieldsQueryCursor<List<?>> queryLocalSqlFields(String schemaName, SqlFieldsQuery qry, final boolean keepBinary, IndexingQueryFilter filter, GridQueryCancel cancel, Long qryId) throws IgniteCheckedException { String sql = qry.getSql(); List<Object> params = F.asList(qry.getArgs()); boolean enforceJoinOrder = qry.isEnforceJoinOrder(), startTx = autoStartTx(qry); int timeout = qry.getTimeout(); final GridQueryFieldsResult res = queryLocalSqlFields(schemaName, sql, params, filter, enforceJoinOrder, startTx, timeout, cancel, qry.isDataPageScanEnabled()); Iterable<List<?>> iter = () -> { try { return new GridQueryCacheObjectsIterator(res.iterator(), objectContext(), keepBinary); } catch (IgniteCheckedException e) { throw new IgniteException(e); } }; QueryCursorImpl<List<?>> cursor = qryId != null ? new RegisteredQueryCursor<>(iter, cancel, runningQueryManager(), qryId) : new QueryCursorImpl<>(iter, cancel); cursor.fieldsMeta(res.metaData()); return cursor; }
/** * Check tracking running queries for DML. * * @param dmlQry DML query. * @throws Exception Exception in case of failure. */ public void testQueryDML(String dmlQry) throws Exception { newBarrier(2); IgniteCache<Object, Object> cache = ignite.cache(DEFAULT_CACHE_NAME); SqlFieldsQuery qry = new SqlFieldsQuery(dmlQry); IgniteInternalFuture<List<List<?>>> fut = GridTestUtils.runAsync(() -> cache.query(qry).getAll()); assertWaitingOnBarrier(); Collection<GridRunningQueryInfo> runningQueries = ignite.context().query().runningQueries(-1); assertEquals(1, runningQueries.size()); assertNoRunningQueries(ignite); runningQueries.forEach((info) -> Assert.assertEquals(qry.getSql(), info.query())); IgniteInternalFuture<Integer> fut1 = GridTestUtils.runAsync(() -> barrier.await()); awaitTimeouted(); fut1.get(TIMEOUT_IN_MS); fut.get(TIMEOUT_IN_MS); }
boolean startTx, MvccQueryTracker mvccTracker, GridQueryCancel cancel, boolean registerAsNewQry) { if (log.isDebugEnabled()) log.debug("Parsed query: `" + qry.getSql() + "` into two step query: " + twoStepQry); cancel = new GridQueryCancel(); Long qryId = registerRunningQuery(schemaName, cancel, qry.getSql(), qry.isLocal(), registerAsNewQry);
/** * Check tracking running queries for DDL. * * @throws Exception Exception in case of failure. */ public void testQueryDDL(String sql) throws Exception { newBarrier(2); IgniteCache<Object, Object> cache = ignite.cache(DEFAULT_CACHE_NAME); SqlFieldsQuery qry = new SqlFieldsQuery(sql); IgniteInternalFuture<List<List<?>>> fut = GridTestUtils.runAsync(() -> cache.query(qry).getAll()); assertWaitingOnBarrier(); Collection<GridRunningQueryInfo> runningQueries = ignite.context().query().runningQueries(-1); assertEquals(1, runningQueries.size()); assertNoRunningQueries(ignite); runningQueries.forEach((info) -> Assert.assertEquals(qry.getSql(), info.query())); awaitTimeouted(); awaitTimeouted(); fut.get(TIMEOUT_IN_MS); }
PreparedStatement stmt = prepareStatementAndCaches(c, qry.getSql()); connMgr.statementCacheForThread().remove(schemaName, qry.getSql()); H2TwoStepCachedQueryKey cachedQryKey = new H2TwoStepCachedQueryKey(schemaName, qry.getSql(), qry.isCollocated(), qry.isDistributedJoins(), qry.isEnforceJoinOrder(), qry.isLocal()); throw new IgniteSQLException("Failed to bind parameters: [qry=" + newQry.getSql() + ", params=" + Arrays.deepToString(newQry.getArgs()) + "]", IgniteQueryErrorCode.PARSING, e);
/** {@inheritDoc} */ @Override public UpdateSourceIterator<?> prepareDistributedUpdate(GridCacheContext<?, ?> cctx, int[] ids, int[] parts, String schema, String qry, Object[] params, int flags, int pageSize, int timeout, AffinityTopologyVersion topVer, MvccSnapshot mvccSnapshot, GridQueryCancel cancel) throws IgniteCheckedException { SqlFieldsQuery fldsQry = new SqlFieldsQuery(qry); if (params != null) fldsQry.setArgs(params); fldsQry.setEnforceJoinOrder(isFlagSet(flags, GridH2QueryRequest.FLAG_ENFORCE_JOIN_ORDER)); fldsQry.setTimeout(timeout, TimeUnit.MILLISECONDS); fldsQry.setPageSize(pageSize); fldsQry.setLocal(true); fldsQry.setDataPageScanEnabled(isDataPageScanEnabled(flags)); boolean loc = true; final boolean replicated = isFlagSet(flags, GridH2QueryRequest.FLAG_REPLICATED); GridCacheContext<?, ?> cctx0; if (!replicated && !F.isEmpty(ids) && (cctx0 = CU.firstPartitioned(cctx.shared(), ids)) != null && cctx0.config().getQueryParallelism() > 1) { fldsQry.setDistributedJoins(true); loc = false; } Connection conn = connMgr.connectionForThread().connection(schema); H2Utils.setupConnection(conn, false, fldsQry.isEnforceJoinOrder()); PreparedStatement stmt = preparedStatementWithParams(conn, fldsQry.getSql(), F.asList(fldsQry.getArgs()), true); return dmlProc.prepareDistributedUpdate(schema, conn, stmt, fldsQry, backupFilter(topVer, parts), cancel, loc, topVer, mvccSnapshot); }
parts, schemaName, fieldsQry.getSql(), fieldsQry.getArgs(), flags,
/** * Formats error message with query details. * * @param msg Error message. * @param qry Query. * @return Result. */ private String getError(String msg, SqlFieldsQuery qry) { return msg + " [qry='" + qry.getSql() + "', params=" + Arrays.deepToString(qry.getArgs()) + ']'; } }
@Override public List<FieldsQueryCursor<List<?>>> applyx() throws IgniteCheckedException { GridQueryCancel cancel = new GridQueryCancel(); List<FieldsQueryCursor<List<?>>> res = idx.querySqlFields(schemaName, qry, cliCtx, keepBinary, failOnMultipleStmts, null, cancel); if (cctx != null) sendQueryExecutedEvent(qry.getSql(), qry.getArgs(), cctx); return res; } };