use of org.apache.ignite.internal.processors.query.h2.sql.GridSqlOperationType.AND in project ignite by apache.
the class GridSubqueryJoinOptimizer method isSimpleSelect.
/**
* Whether Select query is simple or not.
* <p>
* We call query simple if it is select query (not union) and it has neither having nor grouping,
* has no distinct clause, has no aggregations, has no limits, no sorting, no offset clause.
* Also it is not SELECT FOR UPDATE.
*
* @param subQry Sub query.
* @return {@code true} if it is simple query.
*/
private static boolean isSimpleSelect(GridSqlQuery subQry) {
if (subQry instanceof GridSqlUnion)
return false;
GridSqlSelect select = (GridSqlSelect) subQry;
boolean simple = F.isEmpty(select.sort()) && select.offset() == null && select.limit() == null && !select.isForUpdate() && !select.distinct() && select.havingColumn() < 0 && F.isEmpty(select.groupColumns());
if (!simple)
return false;
for (GridSqlAst col : select.columns(true)) {
if (!(col instanceof GridSqlElement))
continue;
// we have to traverse the tree because there may be such expressions
// like ((MAX(col) - MIN(col)) / COUNT(col)
ASTNodeFinder aggFinder = new ASTNodeFinder(col, (p, c) -> p instanceof GridSqlAggregateFunction);
if (aggFinder.findNext() != null)
return false;
// In case of query like "SELECT * FROM (SELECT i||j FROM t) u;", where subquery contains pure operation
// without an alias, we cannot determine which generated alias in the parent query the original expression
// belongs to. So the best we can do is skip the case.
ASTNodeFinder operationFinder = new ASTNodeFinder(col, (p, c) -> p instanceof GridSqlOperation, ast -> false);
if (operationFinder.findNext() != null)
return false;
}
return true;
}
use of org.apache.ignite.internal.processors.query.h2.sql.GridSqlOperationType.AND in project ignite by apache.
the class SchemaManager method createInitialUserIndex.
/**
* Add initial user index.
*
* @param schemaName Schema name.
* @param desc Table descriptor.
* @param h2Idx User index.
* @throws IgniteCheckedException If failed.
*/
private void createInitialUserIndex(String schemaName, H2TableDescriptor desc, GridH2IndexBase h2Idx) throws IgniteCheckedException {
GridH2Table h2Tbl = desc.table();
h2Tbl.proposeUserIndex(h2Idx);
try {
String sql = H2Utils.indexCreateSql(desc.fullTableName(), h2Idx, false);
connMgr.executeStatement(schemaName, sql);
} catch (Exception e) {
// Rollback and re-throw.
h2Tbl.rollbackUserIndex(h2Idx.getName());
throw e;
}
}
use of org.apache.ignite.internal.processors.query.h2.sql.GridSqlOperationType.AND in project ignite by apache.
the class DmlAstUtils method findKeyValueEqualityCondition.
/**
* @param where Element to test.
* @return Whether given element corresponds to {@code WHERE _key = ?}, and key is a literal expressed
* in query or a query param.
*/
@SuppressWarnings("RedundantCast")
private static IgnitePair<GridSqlElement> findKeyValueEqualityCondition(GridSqlElement where) {
if (!(where instanceof GridSqlOperation))
return null;
GridSqlOperation whereOp = (GridSqlOperation) where;
// Does this WHERE limit only by _key?
if (isKeyEqualityCondition(whereOp))
return new IgnitePair<>((GridSqlElement) whereOp.child(1), null);
// Or maybe it limits both by _key and _val?
if (whereOp.operationType() != GridSqlOperationType.AND)
return null;
GridSqlElement left = whereOp.child(0);
GridSqlElement right = whereOp.child(1);
if (!(left instanceof GridSqlOperation && right instanceof GridSqlOperation))
return null;
GridSqlOperation leftOp = (GridSqlOperation) left;
GridSqlOperation rightOp = (GridSqlOperation) right;
if (isKeyEqualityCondition(leftOp)) {
// _key = ? and _val = ?
if (!isValueEqualityCondition(rightOp))
return null;
return new IgnitePair<>((GridSqlElement) leftOp.child(1), (GridSqlElement) rightOp.child(1));
} else if (isKeyEqualityCondition(rightOp)) {
// _val = ? and _key = ?
if (!isValueEqualityCondition(leftOp))
return null;
return new IgnitePair<>((GridSqlElement) rightOp.child(1), (GridSqlElement) leftOp.child(1));
} else
// Neither
return null;
}
use of org.apache.ignite.internal.processors.query.h2.sql.GridSqlOperationType.AND in project ignite by apache.
the class DmlAstUtils method findParams.
/**
* @param qry Select.
* @param params Parameters.
* @param target Extracted parameters.
* @param paramIdxs Parameter indexes.
* @return Extracted parameters list.
*/
private static List<Object> findParams(GridSqlSelect qry, Object[] params, ArrayList<Object> target, IntArray paramIdxs) {
if (params.length == 0)
return target;
for (GridSqlAst el : qry.columns(false)) findParams((GridSqlElement) el, params, target, paramIdxs);
findParams((GridSqlElement) qry.from(), params, target, paramIdxs);
findParams((GridSqlElement) qry.where(), params, target, paramIdxs);
// Don't search in GROUP BY and HAVING since they expected to be in select list.
findParams((GridSqlElement) qry.limit(), params, target, paramIdxs);
findParams((GridSqlElement) qry.offset(), params, target, paramIdxs);
return target;
}
use of org.apache.ignite.internal.processors.query.h2.sql.GridSqlOperationType.AND in project ignite by apache.
the class OpenCensusSqlNativeTracingTest method checkDmlQuerySpans.
/**
* Executes DML query and checks corresponding span tree.
*
* @param qry SQL query to execute.
* @param fetchRequired Whether query need to fetch data before cache update.
*/
private void checkDmlQuerySpans(String qry, boolean fetchRequired, int expCacheUpdates) throws Exception {
SpanId rootSpan = executeAndCheckRootSpan(qry, TEST_SCHEMA, false, false, false);
checkChildSpan(SQL_QRY_PARSE, rootSpan);
SpanId dmlExecSpan = checkChildSpan(SQL_DML_QRY_EXECUTE, rootSpan);
if (fetchRequired) {
checkChildSpan(SQL_ITER_OPEN, dmlExecSpan);
int fetchedRows = findChildSpans(SQL_PAGE_FETCH, null).stream().mapToInt(span -> parseInt(getAttribute(span, SQL_PAGE_ROWS))).sum();
assertEquals(expCacheUpdates, fetchedRows);
}
int cacheUpdates = findChildSpans(SQL_CACHE_UPDATE, dmlExecSpan).stream().mapToInt(span -> parseInt(getAttribute(span, SQL_CACHE_UPDATES))).sum();
assertEquals(expCacheUpdates, cacheUpdates);
}
Aggregations