void ConstraintsParser::verifyTerm()

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 );
            }
        }
    }
}