/** * 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()) + ']'; } }
/** * 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); }
/** * Convert query arguments to BinaryObjects if binary marshaller used. * * @param qry Query. */ private void convertToBinary(final Query qry) { GridCacheContext<K, V> ctx = getContextSafe(); if (ctx.binaryMarshaller()) { if (qry instanceof SqlQuery) { final SqlQuery sqlQry = (SqlQuery) qry; convertToBinary(sqlQry.getArgs()); } else if (qry instanceof SpiQuery) { final SpiQuery spiQry = (SpiQuery) qry; convertToBinary(spiQry.getArgs()); } else if (qry instanceof SqlFieldsQuery) { final SqlFieldsQuery fieldsQry = (SqlFieldsQuery) qry; convertToBinary(fieldsQry.getArgs()); } } }
/** 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 }
/** * @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); }
/** {@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; }
connMgr.connectionForThread().connection(qry.getSchema()), prepared, qry.getArgs(), qry.isCollocated(), qry.isDistributedJoins(),
IgniteBiTuple row = plan.getFastRow(fieldsQry.getArgs()); it = new DmlUpdateResultsIterator(UpdatePlan.enlistOperation(plan.mode()), plan, plan.createRows(fieldsQry.getArgs())); else { .setArgs(fieldsQry.getArgs()) .setDistributedJoins(fieldsQry.isDistributedJoins()) .setEnforceJoinOrder(fieldsQry.isEnforceJoinOrder()) schemaName, fieldsQry.getSql(), fieldsQry.getArgs(), flags, fieldsQry.getPageSize(), UpdateResult fastUpdateRes = plan.processFast(fieldsQry.getArgs()); .setArgs(fieldsQry.getArgs()) .setDistributedJoins(fieldsQry.isDistributedJoins()) .setEnforceJoinOrder(fieldsQry.isEnforceJoinOrder()) cur = plan.createRows(fieldsQry.getArgs()); else { final GridQueryFieldsResult res = idx.queryLocalSqlFields(schemaName, plan.selectQuery(), F.asList(fieldsQry.getArgs()), filters, fieldsQry.isEnforceJoinOrder(), false, fieldsQry.getTimeout(), cancel, null);
/** {@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); }
/** * 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; } };
/** * 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 = connectionForSchema(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); }
/** 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) 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); QueryCursorImpl<List<?>> cursor = new QueryCursorImpl<>(new Iterable<List<?>>() { @SuppressWarnings("NullableProblems") @Override public Iterator<List<?>> iterator() { try { return new GridQueryCacheObjectsIterator(res.iterator(), objectContext(), keepBinary); } catch (IgniteCheckedException e) { throw new IgniteException(e); } } }, cancel); cursor.fieldsMeta(res.metaData()); return cursor; }