private void validateQuery(Command command) throws QueryValidatorException, TeiidComponentException { // Create generic sql validation visitor AbstractValidationVisitor visitor = new ValidationVisitor(); validateWithVisitor(visitor, metadata, command); }
public void visit(AlterView obj) { try { QueryResolver.validateProjectedSymbols(obj.getTarget(), getMetadata(), obj.getDefinition()); Validator.validate(obj.getDefinition(), getMetadata(), this); validateAlterTarget(obj); } catch (QueryValidatorException e) { handleValidationError(e.getMessage(), obj.getDefinition()); } catch (TeiidComponentException e) { handleException(e); } }
private void validateSortable(Expression symbol) { if (isNonComparable(symbol)) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0026", symbol, DataTypeManager.getDataTypeName(symbol.getType())), symbol); //$NON-NLS-1$ } }
public void visit(Query obj) { validateHasProjectedSymbols(obj); this.inQuery = true; validateAggregates(obj); if (obj.getInto() != null) { validateSelectInto(obj); } }
/** * This method can be used to validate commands used in the stored * procedure languge cannot be executed against XML documents. */ protected void validateNoXMLProcedures(Command obj) { if(isXMLCommand(obj)) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0030"), obj); //$NON-NLS-1$ } }
@Override public void visit(GroupSymbol obj) { try { if (this.getMetadata().isScalarGroup(obj.getMetadataID())) { handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.invalid_scalar_group_reference", obj),obj); //$NON-NLS-1$ } } catch (QueryMetadataException e) { handleException(e); } catch (TeiidComponentException e) { handleException(e); } }
@Override public void visit(AggregateSymbol obj) { if (!inQuery) { handleValidationError(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level", obj), obj); //$NON-NLS-1$ return; AggregateAttributes aa = obj.getFunctionDescriptor().getMethod().getAggregateAttributes(); if (!aa.allowsDistinct() && obj.isDistinct()) { handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.uda_not_allowed", "DISTINCT", obj), obj); //$NON-NLS-1$ //$NON-NLS-2$ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.uda_not_allowed", "ORDER BY", obj), obj); //$NON-NLS-1$ //$NON-NLS-2$ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.uda_analytic", obj), obj); //$NON-NLS-1$ validateNoSubqueriesOrOuterReferences(condition); validateNoNestedAggs(expression, obj.isWindowed()); validateNoNestedAggs(obj.getOrderBy(), false); validateNoNestedAggs(obj.getCondition(), false); handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0041", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$ } else if (obj.getType() != DataTypeManager.DefaultDataClasses.NULL) { if (aggregateFunction == Type.XMLAGG && aggExps[0].getType() != DataTypeManager.DefaultDataClasses.XML) { handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_xml", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$ } else if (obj.isBoolean() && aggExps[0].getType() != DataTypeManager.DefaultDataClasses.BOOLEAN) { handleValidationError(QueryPlugin.Util.getString("AggregateValidationVisitor.non_boolean", new Object[] {aggregateFunction, obj}), obj); //$NON-NLS-1$ } else if (aggregateFunction == Type.JSONARRAY_AGG) { validateJSONValue(obj, aggExps[0]); } else if (obj.getType() == null) {
try { Set<ElementSymbol> seen = new HashSet<ElementSymbol>(); boolean multiSource = getMetadata().isMultiSource(getMetadata().getModelID(insertGroup.getMetadataID())); if(! getMetadata().elementSupports(insertElem.getMetadataID(), SupportConstants.Element.UPDATE) && !isUpsertKeyColumn(obj, insertElem)) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0052", insertElem), insertElem); //$NON-NLS-1$ if (multiSource && getMetadata().isMultiSourceElement(insertElem.getMetadataID())) { multiSource = false; handleValidationError(QueryPlugin.Util.gs(QueryPlugin.Event.TEIID31179, obj.getGroup(), insertElem), insertElem); validateMultisourceInsert(insertGroup); Collection<ElementSymbol> insertElmnts = new LinkedList<ElementSymbol>(ResolverUtil.resolveElementsInGroup(insertGroup, getMetadata())); if(!getMetadata().elementSupports(nextElmnt.getMetadataID(), SupportConstants.Element.DEFAULT_VALUE) && !getMetadata().elementSupports(nextElmnt.getMetadataID(), SupportConstants.Element.NULL) && !getMetadata().elementSupports(nextElmnt.getMetadataID(), SupportConstants.Element.AUTO_INCREMENT)) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0053", new Object[] {insertGroup, nextElmnt}), nextElmnt); //$NON-NLS-1$ if(evaluatedValue == null && ! getMetadata().elementSupports(nextVar.getMetadataID(), SupportConstants.Element.NULL)) { if (!isUpsertKeyColumn(obj, nextVar) || !(getMetadata().elementSupports(nextVar.getMetadataID(), SupportConstants.Element.AUTO_INCREMENT) || getMetadata().elementSupports(nextVar.getMetadataID(), SupportConstants.Element.DEFAULT_VALUE))) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0055", nextVar), nextVar); //$NON-NLS-1$
public void visit(Function obj) { if (!this.getMetadata().isEnvAllowed() && (obj.getName().equalsIgnoreCase(FunctionLibrary.ENV) || obj.getName().equalsIgnoreCase(FunctionLibrary.SYS_PROP) || obj.getName().equalsIgnoreCase(FunctionLibrary.ENV_VAR))) { handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.env_not_allowed", obj, obj.getName()), obj); //$NON-NLS-1$ } else if(FunctionLibrary.LOOKUP.equalsIgnoreCase(obj.getName())) { try { ResolverUtil.ResolvedLookup resolvedLookup = ResolverUtil.resolveLookup(obj, getMetadata()); if(ValidationVisitor.isNonComparable(resolvedLookup.getKeyElement())) { handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.invalid_lookup_key", resolvedLookup.getKeyElement(), DataTypeManager.getDataTypeName(resolvedLookup.getKeyElement().getType())), resolvedLookup.getKeyElement()); //$NON-NLS-1$ handleException(e, obj); } catch (TeiidProcessingException e) { handleException(e, obj); XMLSystemFunctions.validateXpath((String)xpathConst.getValue()); } catch(TeiidProcessingException e) { handleValidationError(QueryPlugin.Util.getString("QueryResolver.invalid_xpath", e.getMessage()), obj); //$NON-NLS-1$ CharsetUtils.getCharset((String)((Constant)obj.getArg(1)).getValue()); } catch (IllegalArgumentException e) { handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.invalid_encoding", obj.getArg(1)), obj); //$NON-NLS-1$ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.user_defined_aggregate_as_function", obj, obj.getName()), obj); //$NON-NLS-1$ } else if (FunctionLibrary.JSONARRAY.equalsIgnoreCase(obj.getName())) { Expression[] args = obj.getArgs(); for (Expression expression : args) { validateJSONValue(obj, expression);
public void visit(Query obj) { validateHasProjectedSymbols(obj); if(isXMLCommand(obj)) { //no temp table (Select Into) allowed if(obj.getInto() != null){ handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0069"),obj); //$NON-NLS-1$ } this.isXML = true; validateXMLQuery(obj); } else { this.inQuery = true; validateAggregates(obj); if (obj.getInto() != null) { validateSelectInto(obj); } } }
public void visit(SubquerySetCriteria obj) { validateSubquery(obj); if (isNonComparable(obj.getExpression())) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0027", obj, DataTypeManager.getDataTypeName(obj.getExpression().getType())),obj); //$NON-NLS-1$ } }
@Override public void visit(XMLForest obj) { validateDerivedColumnNames(obj, obj.getArgs()); for (DerivedColumn dc : obj.getArgs()) { if (dc.getAlias() == null) { continue; } validateQName(obj, dc.getAlias()); validateXMLContentTypes(dc.getExpression(), obj); } }
@Override public void visit(XMLAttributes obj) { validateDerivedColumnNames(obj, obj.getArgs()); for (DerivedColumn dc : obj.getArgs()) { if (dc.getAlias() == null) { continue; } if ("xmlns".equals(dc.getAlias())) { //$NON-NLS-1$ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.xml_attributes_reserved"), obj); //$NON-NLS-1$ } String[] parts = validateQName(obj, dc.getAlias()); if (parts == null) { continue; } if ("xmlns".equals(parts[0])) { //$NON-NLS-1$ handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.xml_attributes_reserved", dc.getAlias()), obj); //$NON-NLS-1$ } } }
GroupBy groupBy = query.getGroupBy(); Criteria having = query.getHaving(); validateNoAggsInClause(groupBy); List<GroupSymbol> correlationGroups = null; validateNoAggsInClause(query.getCriteria()); if (query.getFrom() == null) { validateNoAggsInClause(select); validateNoAggsInClause(query.getOrderBy()); } else { validateNoAggsInClause(query.getFrom()); correlationGroups = query.getFrom().getGroups(); LinkedList<AggregateSymbol> aggs = new LinkedList<AggregateSymbol>(); if (having != null) { validateCorrelatedReferences(query, correlationGroups, groupSymbols, having, invalid); AggregateSymbolCollectorVisitor.getAggregates(having, aggs, invalid, null, invalidWindowFunctions, groupSymbols); hasAgg = true; validateCorrelatedReferences(query, correlationGroups, groupSymbols, symbol, invalid); handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0037", invalid), invalid); //$NON-NLS-1$ handleValidationError(QueryPlugin.Util.getString("SQLParser.window_only_top_level", invalidWindowFunctions), invalidWindowFunctions); //$NON-NLS-1$
/** * @see org.teiid.query.sql.LanguageVisitor#visit(org.teiid.query.sql.lang.SubqueryCompareCriteria) * @since 4.3 */ public void visit(SubqueryCompareCriteria obj) { validateSubquery(obj); if (isNonComparable(obj.getLeftExpression())) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0027", obj, DataTypeManager.getDataTypeName(obj.getLeftExpression().getType())),obj); //$NON-NLS-1$ } this.validateRowLimitFunctionNotInInvalidCriteria(obj); }
/** * @see org.teiid.query.sql.LanguageVisitor#visit(org.teiid.query.sql.lang.SetCriteria) * @since 4.3 */ public void visit(SetCriteria obj) { if (isNonComparable(obj.getExpression())) { handleValidationError(QueryPlugin.Util.getString("ERR.015.012.0027", obj, DataTypeManager.getDataTypeName(obj.getExpression().getType())),obj); //$NON-NLS-1$ } this.validateRowLimitFunctionNotInInvalidCriteria(obj); }
private void validateAlterTarget(Alter<?> obj) throws QueryMetadataException, TeiidComponentException { Object schemaId = obj.getTarget().getMetadataID(); if (schemaId == null) { return; } if (getMetadata().getImportedModels().contains(getMetadata().getName(schemaId))) { handleValidationError(QueryPlugin.Util.getString("ValidationVisitor.invalid_alter", obj.getTarget()), obj.getTarget()); //$NON-NLS-1$ } }
private void validateNoAggsInClause(LanguageObject clause) { if (clause == null) { return; } LinkedHashSet<Expression> aggs = new LinkedHashSet<Expression>(); AggregateSymbolCollectorVisitor.getAggregates(clause, aggs, null, null, aggs, null); if (!aggs.isEmpty()) { handleValidationError(QueryPlugin.Util.getString("SQLParser.Aggregate_only_top_level", aggs), aggs); //$NON-NLS-1$ } }
private boolean isUpsertKeyColumn(Insert obj, ElementSymbol insertElem) throws TeiidComponentException, QueryMetadataException { if (!obj.isUpsert()) { return false; } Collection keys = getMetadata().getUniqueKeysInGroup(obj.getGroup().getMetadataID()); //not an actual update, but a modification of existing row return !keys.isEmpty() && getMetadata().getElementIDsInKey(keys.iterator().next()).contains(insertElem.getMetadataID()); }
@Override public void visit(QueryString obj) { validateDerivedColumnNames(obj, obj.getArgs()); }