res.distinct(select.isDistinct()); TableFilter filter = select.getTopTableFilter(); IgniteQueryErrorCode.UNSUPPORTED_OPERATION); if (select.getLimit() != null || select.getOffset() != null) throw new IgniteSQLException("LIMIT/OFFSET clauses are not supported for SELECT FOR UPDATE.", IgniteQueryErrorCode.UNSUPPORTED_OPERATION); ArrayList<Expression> expressions = select.getExpressions(); res.addColumn(parseExpression(expressions.get(i), true), i < select.getColumnCount()); processSortOrder(select.getSortOrder(), res); res.limit(parseExpression(select.getLimit(), false)); res.offset(parseExpression(select.getOffset(), false));
private void parseSelectSimpleFromPart(Select command) { do { TableFilter filter = readTableFilter(); parseJoinTableFilter(filter, command); } while (readIf(",")); // Parser can reorder joined table filters, need to explicitly sort them // to get the order as it was in the original query. if (session.isForceJoinOrder()) { sortTableFilters(command.getTopFilters()); } }
@Override public Value getValue(Session session) { if (select.isQuickAggregateQuery()) { switch (type) { case COUNT: case COUNT_ALL: Table table = select.getTopTableFilter().getTable(); return ValueLong.get(table.getRowCount(session)); case MIN: HashMap<Expression, Object> group = select.getCurrentGroup(); if (group == null) { throw DbException.get(ErrorCode.INVALID_USE_OF_AGGREGATE_FUNCTION_1, getSQL());
private Select parseValues() { Select command = new Select(session); currentSelect = command; TableFilter filter = parseValuesTable(0); ArrayList<Expression> list = New.arrayList(); list.add(new Wildcard(null, null)); command.setExpressions(list); command.addTableFilter(filter, true); command.init(); return command; }
SelectListColumnResolver(Select select) { this.select = select; int columnCount = select.getColumnCount(); columns = new Column[columnCount]; expressions = new Expression[columnCount]; ArrayList<Expression> columnList = select.getExpressions(); ColumnNamer columnNamer= new ColumnNamer(select.getSession()); for (int i = 0; i < columnCount; i++) { Expression expr = columnList.get(i); String columnName = columnNamer.getColumnName(expr, i, expr.getAlias()); Column column = new Column(columnName, Value.NULL); column.setTable(null, i); columns[i] = column; expressions[i] = expr.getNonAliasExpression(); } }
private void parseJoinTableFilter(TableFilter top, final Select command) { top = readJoin(top); command.addTableFilter(top, true); boolean isOuter = false; while (true) { command.addTableFilter(join, false); } else { command.addCondition(on); command.addTableFilter(join, true);
Select command = new Select(session); int start = lastParseIndex; Select oldSelect = currentSelect; rightsChecked, currentSelect, 0, null); command.addTableFilter(filter, true); } else { parseSelectSimpleFromPart(command); command.addCondition(condition); if (readIf("GROUP")) { read("BY"); command.setGroupQuery(); ArrayList<Expression> list = New.arrayList(); do { list.add(expr); } while (readIf(",")); command.setGroupBy(list); command.setGroupQuery(); Expression condition = readExpression(); command.setHaving(condition); command.setParameterList(parameters); currentSelect = oldSelect; setSQL(command, "SELECT", start);
DbException.throwInternalError(); expandColumnList(); visibleColumnCount = expressions.size(); ArrayList<String> expressionSQL; initOrder(session, expressions, expressionSQL, orderList, visibleColumnCount, distinct, filters); mapColumns(f, 0);
HashMap<Expression, Object> group = select.getCurrentGroup(); if (group == null) { int groupRowId = select.getCurrentGroupRowId(); if (lastGroupRowId == groupRowId) {
public JoinBatch getJoinBatch() { return getTopTableFilter().getJoinBatch(); }
@Override public void updateAggregate(Session session) { Value now = columnResolver.getValue(column); Select select = columnResolver.getSelect(); if (select == null) { throw DbException.get(ErrorCode.MUST_GROUP_BY_COLUMN_1, getSQL()); } HashMap<Expression, Object> values = select.getCurrentGroup(); if (values == null) { // this is a different level (the enclosing query) return; } Value v = (Value) values.get(this); if (v == null) { values.put(this, now); } else { if (!database.areEqual(now, v)) { throw DbException.get(ErrorCode.MUST_GROUP_BY_COLUMN_1, getSQL()); } } }
SelectListColumnResolver(Select select) { this.select = select; int columnCount = select.getColumnCount(); columns = new Column[columnCount]; expressions = new Expression[columnCount]; ArrayList<Expression> columnList = select.getExpressions(); for (int i = 0; i < columnCount; i++) { Expression expr = columnList.get(i); Column column = new Column(expr.getAlias(), Value.NULL); column.setTable(null, i); columns[i] = column; expressions[i] = expr.getNonAliasExpression(); } }
setEvaluatableRecursive(n); if (!f.isJoinOuter() && !f.isJoinOuterIndirect()) { f.removeJoinCondition(); addCondition(on); if (!on.isEverything(ExpressionVisitor.EVALUATABLE_VISITOR)) { f.removeFilterCondition(); addCondition(on);
/** * Returns null if the validation fails. Returns the table name used in the query if the validation succeeds. * @param query to validate. * @return Null if the validation fails. The name of the table if the validation succeeds. */ public String validateQuery(String query) { Select select = queryToSelect(query); if (select ==null) return null; if ((select.getTables().size() != 1) || (select.getTopFilters().size()!=1) || select.isQuickAggregateQuery() ) return null; return select.getTables().iterator().next().getName(); }
@Override public void accept(TableFilter f) { command.addTableFilter(f, false); } });
private DataField[] getFields(Select select, DataField[] fields) { ArrayList<DataField> toReturn = new ArrayList<DataField>(); try { for (int i=0;i<select.getColumnCount();i++) { String name = select.queryMeta().getColumnName(i); if (name.equalsIgnoreCase("timed") || name.equalsIgnoreCase("pk") ) continue; String gsnType = null; for (int j=0;j<fields.length;j++) { if (fields[j].getName().equalsIgnoreCase(name)) { gsnType=fields[j].getType(); toReturn.add( new DataField(name,gsnType)); break; } } } return toReturn.toArray(new DataField[] {}); }catch (Exception e) { logger.debug(e.getMessage(),e); return new DataField[0]; } } private Select queryToSelect(String query) {
@Override public void addGlobalCondition(Parameter param, int columnId, int comparisonType) { addParameter(param); Expression comp; Expression col = expressions.get(columnId);
throw Message.getInternalError(); expandColumnList(); visibleColumnCount = expressions.size(); ObjectArray expressionSQL; initOrder(expressions, expressionSQL, orderList, visibleColumnCount, distinct);
expressions.remove(i); for (TableFilter filter : filters) { i = expandColumnList(filter, i); i = expandColumnList(filter, i); i--;
addCondition(on); if (!on.isEverything(ExpressionVisitor.EVALUATABLE)) { f.removeFilterCondition(); addCondition(on);