in cli/cparser.cpp [493:564]
void ConstraintsParser::verifyTerm( CTerm* term )
{
// Is Parameter defined in the model?
if ( term->Parameter == nullptr )
{
throw CSemanticWarning( ValidationWarnType::UnknownParameter );
}
// LIKE is only for string parameters and should have a string value
if ( term->RelationType == RelationType::Like
|| term->RelationType == RelationType::NotLike )
{
if ( term->Parameter->Type == DataType::Number )
{
throw CErrValidation( ValidationErrType::LIKECannotBeUsedForNumericParameters );
}
if ( term->DataType == TermDataType::Value
&& ( (CValue*) term->Data )->DataType == DataType::Number )
{
throw CErrValidation( ValidationErrType::LIKECannotBeUsedWithNumericValues );
}
}
// Parameter can only be compared to a value of the same type
if ( term->DataType == TermDataType::Value )
{
if ( term->Parameter->Type != ((CValue*) term->Data )->DataType )
{
throw CErrValidation( ValidationErrType::ParameterComparedToValueOfDifferentType );
}
}
// Is second parameter defined?
if ( term->DataType == TermDataType::ParameterName )
{
if ( term->Data == nullptr )
{
throw CSemanticWarning( ValidationWarnType::UnknownParameter );
}
}
// 1. Two parameters to be comparable must be of the same type
// 2. A parameter shouldn't be compared to itself
if ( term->DataType == TermDataType::ParameterName )
{
if ( term->Parameter->Type != ((CParameter*) term->Data )->Type )
{
throw CErrValidation( ValidationErrType::ParametersOfDifferentTypesCompared );
}
if ( term->Parameter->Name == ((CParameter*) term->Data )->Name )
{
throw CErrValidation( ValidationErrType::ParameterComparedToItself );
}
}
// IN has a value set on the right side; all values should be of the type of the bound parameter
if ( term->DataType == TermDataType::ValueSet )
{
CValueSet* valueSet = (CValueSet*) term->Data;
for ( CValueSet::iterator i_val = valueSet->begin();
i_val != valueSet->end();
++i_val )
{
if ( term->Parameter->Type != i_val->DataType )
{
throw CErrValidation( ValidationErrType::ParameterValueSetTypeMismatch );
}
}
}
}