use of org.apache.ignite.internal.sql.command.SqlSetStreamingCommand in project ignite by apache.
the class JdbcThinConnection method executeNative.
/**
* @param sql Statement.
* @param cmd Parsed form of {@code sql}.
* @throws SQLException if failed.
*/
void executeNative(String sql, SqlCommand cmd) throws SQLException {
if (cmd instanceof SqlSetStreamingCommand) {
// If streaming is already on, we have to disable it first.
if (stream) {
// We have to send request regardless of actual batch size.
executeBatch(true);
stream = false;
}
boolean newVal = ((SqlSetStreamingCommand) cmd).isTurnOn();
// Actual ON, if needed.
if (newVal) {
sendRequest(new JdbcQueryExecuteRequest(JdbcStatementType.ANY_STATEMENT_TYPE, schema, 1, 1, sql, null));
streamBatchSize = ((SqlSetStreamingCommand) cmd).batchSize();
stream = true;
}
} else
throw IgniteQueryErrorCode.createJdbcSqlException("Unsupported native statement: " + sql, IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
}
use of org.apache.ignite.internal.sql.command.SqlSetStreamingCommand in project ignite by apache.
the class JdbcThinConnection method executeNative.
/**
* @param sql Statement.
* @param cmd Parsed form of {@code sql}.
* @param stmt Jdbc thin statement.
* @throws SQLException if failed.
*/
void executeNative(String sql, SqlCommand cmd, JdbcThinStatement stmt) throws SQLException {
if (cmd instanceof SqlSetStreamingCommand) {
SqlSetStreamingCommand cmd0 = (SqlSetStreamingCommand) cmd;
// If streaming is already on, we have to close it first.
if (streamState != null) {
streamState.close();
streamState = null;
}
boolean newVal = ((SqlSetStreamingCommand) cmd).isTurnOn();
ensureConnected();
JdbcThinTcpIo cliIo = cliIo(null);
// Actual ON, if needed.
if (newVal) {
if (!cmd0.isOrdered() && !cliIo.isUnorderedStreamSupported()) {
throw new SQLException("Streaming without order doesn't supported by server [remoteNodeVer=" + cliIo.igniteVersion() + ']', INTERNAL_ERROR);
}
streamState = new StreamState((SqlSetStreamingCommand) cmd, cliIo);
sendRequest(new JdbcQueryExecuteRequest(JdbcStatementType.ANY_STATEMENT_TYPE, schema, 1, 1, autoCommit, stmt.explicitTimeout, sql, null), stmt, cliIo);
streamState.start();
}
} else
throw IgniteQueryErrorCode.createJdbcSqlException("Unsupported native statement: " + sql, IgniteQueryErrorCode.UNSUPPORTED_OPERATION);
}
use of org.apache.ignite.internal.sql.command.SqlSetStreamingCommand in project ignite by apache.
the class SqlParserSetStreamingSelfTest method parseValidate.
/**
* Parse and validate SQL script.
*
* @param sql SQL.
* @param expOn Expected on/off value.
* @param expAllowOverwrite Expected allow overwrite flag.
* @param expBatchSize Expected batch size.
* @param expParOps Expected per-node parallael operations.
* @param expBufSize Expected per node buffer size.
* @param expFlushFreq Expected flush frequency.
* @param ordered Ordered stream flag.
*/
private static void parseValidate(String sql, boolean expOn, boolean expAllowOverwrite, int expBatchSize, int expParOps, int expBufSize, long expFlushFreq, boolean ordered) {
SqlSetStreamingCommand cmd = (SqlSetStreamingCommand) new SqlParser(QueryUtils.DFLT_SCHEMA, sql).nextCommand();
assertEquals(expOn, cmd.isTurnOn());
assertEquals(expAllowOverwrite, cmd.allowOverwrite());
assertEquals(expBatchSize, cmd.batchSize());
assertEquals(expParOps, cmd.perNodeParallelOperations());
assertEquals(expBufSize, cmd.perNodeBufferSize());
assertEquals(expFlushFreq, cmd.flushFrequency());
assertEquals(ordered, cmd.isOrdered());
}
use of org.apache.ignite.internal.sql.command.SqlSetStreamingCommand in project ignite by apache.
the class QueryParser method parseNative.
/**
* Tries to parse sql query text using native parser. Only first (leading) sql command of the multi-statement is
* actually parsed.
*
* @param schemaName Schema name.
* @param qry which sql text to parse.
* @param remainingAllowed Whether multiple statements are allowed.
* @return Command or {@code null} if cannot parse this query.
*/
@SuppressWarnings("IfMayBeConditional")
@Nullable
private QueryParserResult parseNative(String schemaName, SqlFieldsQuery qry, boolean remainingAllowed) {
String sql = qry.getSql();
// Heuristic check for fast return.
if (!INTERNAL_CMD_RE.matcher(sql.trim()).find())
return null;
try {
SqlParser parser = new SqlParser(schemaName, sql);
SqlCommand nativeCmd = parser.nextCommand();
assert nativeCmd != null : "Empty query. Parser met end of data";
if (!(nativeCmd instanceof SqlCreateIndexCommand || nativeCmd instanceof SqlDropIndexCommand || nativeCmd instanceof SqlBeginTransactionCommand || nativeCmd instanceof SqlCommitTransactionCommand || nativeCmd instanceof SqlRollbackTransactionCommand || nativeCmd instanceof SqlBulkLoadCommand || nativeCmd instanceof SqlAlterTableCommand || nativeCmd instanceof SqlSetStreamingCommand || nativeCmd instanceof SqlCreateUserCommand || nativeCmd instanceof SqlAlterUserCommand || nativeCmd instanceof SqlDropUserCommand || nativeCmd instanceof SqlKillQueryCommand || nativeCmd instanceof SqlKillComputeTaskCommand || nativeCmd instanceof SqlKillServiceCommand || nativeCmd instanceof SqlKillTransactionCommand || nativeCmd instanceof SqlKillScanQueryCommand || nativeCmd instanceof SqlKillContinuousQueryCommand || nativeCmd instanceof SqlAnalyzeCommand || nativeCmd instanceof SqlRefreshStatitsicsCommand || nativeCmd instanceof SqlDropStatisticsCommand))
return null;
SqlFieldsQuery newQry = cloneFieldsQuery(qry).setSql(parser.lastCommandSql());
QueryDescriptor newPlanKey = queryDescriptor(schemaName, newQry);
SqlFieldsQuery remainingQry = null;
if (!F.isEmpty(parser.remainingSql())) {
checkRemainingAllowed(remainingAllowed);
remainingQry = cloneFieldsQuery(qry).setSql(parser.remainingSql()).setArgs(qry.getArgs());
}
QueryParserResultCommand cmd = new QueryParserResultCommand(nativeCmd, null, false);
return new QueryParserResult(newPlanKey, queryParameters(newQry), remainingQry, // Currently none of native statements supports parameters.
Collections.emptyList(), null, null, cmd);
} catch (SqlStrictParseException e) {
throw new IgniteSQLException(e.getMessage(), e.errorCode(), e);
} catch (Exception e) {
// Cannot parse, return.
if (log.isDebugEnabled())
log.debug("Failed to parse SQL with native parser [qry=" + sql + ", err=" + e + ']');
if (!IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_SQL_PARSER_DISABLE_H2_FALLBACK))
return null;
int code = IgniteQueryErrorCode.PARSING;
if (e instanceof SqlParseException)
code = ((SqlParseException) e).code();
throw new IgniteSQLException("Failed to parse DDL statement: " + sql + ": " + e.getMessage(), code, e);
}
}
use of org.apache.ignite.internal.sql.command.SqlSetStreamingCommand in project ignite by apache.
the class IgniteH2Indexing method tryQueryDistributedSqlFieldsNative.
/**
* Try executing query using native facilities.
*
* @param schemaName Schema name.
* @param sql Query.
* @param cliCtx Client context, or {@code null} if not applicable.
* @return Result or {@code null} if cannot parse/process this query.
*/
private List<FieldsQueryCursor<List<?>>> tryQueryDistributedSqlFieldsNative(String schemaName, String sql, @Nullable SqlClientContext cliCtx) {
// Heuristic check for fast return.
if (!INTERNAL_CMD_RE.matcher(sql.trim()).find())
return null;
// Parse.
SqlCommand cmd;
try {
SqlParser parser = new SqlParser(schemaName, sql);
cmd = parser.nextCommand();
// No support for multiple commands for now.
if (parser.nextCommand() != null)
return null;
// CREATE/ALTER/DROP USER
if (!(cmd instanceof SqlCreateIndexCommand || cmd instanceof SqlDropIndexCommand || cmd instanceof SqlAlterTableCommand || cmd instanceof SqlBulkLoadCommand || cmd instanceof SqlSetStreamingCommand || cmd instanceof SqlCreateUserCommand || cmd instanceof SqlAlterUserCommand || cmd instanceof SqlDropUserCommand))
return null;
} catch (Exception e) {
// Cannot parse, return.
if (log.isDebugEnabled())
log.debug("Failed to parse SQL with native parser [qry=" + sql + ", err=" + e + ']');
if (!IgniteSystemProperties.getBoolean(IgniteSystemProperties.IGNITE_SQL_PARSER_DISABLE_H2_FALLBACK))
return null;
int code = IgniteQueryErrorCode.PARSING;
if (e instanceof SqlParseException)
code = ((SqlParseException) e).code();
throw new IgniteSQLException("Failed to parse DDL statement: " + sql + ": " + e.getMessage(), code, e);
}
// Execute.
if (cmd instanceof SqlBulkLoadCommand) {
FieldsQueryCursor<List<?>> cursor = dmlProc.runNativeDmlStatement(sql, cmd);
return Collections.singletonList(cursor);
} else if (cmd instanceof SqlSetStreamingCommand) {
if (cliCtx == null)
throw new IgniteSQLException("SET STREAMING command can only be executed from JDBC or ODBC driver.");
SqlSetStreamingCommand setCmd = (SqlSetStreamingCommand) cmd;
boolean on = setCmd.isTurnOn();
if (on)
cliCtx.enableStreaming(setCmd.allowOverwrite(), setCmd.flushFrequency(), setCmd.perNodeBufferSize(), setCmd.perNodeParallelOperations());
else
cliCtx.disableStreaming();
return Collections.singletonList(H2Utils.zeroCursor());
} else {
try {
FieldsQueryCursor<List<?>> cursor = ddlProc.runDdlStatement(sql, cmd);
return Collections.singletonList(cursor);
} catch (IgniteCheckedException e) {
throw new IgniteSQLException("Failed to execute DDL statement [stmt=" + sql + "]: " + e.getMessage(), e);
}
}
}
Aggregations