diff --git a/modules/mol/base/src/impl/query_impl.cc b/modules/mol/base/src/impl/query_impl.cc index 92b00434666358db3197e01463020751976de0c5..d801f68ab8c72782b813f38a7acd7b64c9ef346c 100644 --- a/modules/mol/base/src/impl/query_impl.cc +++ b/modules/mol/base/src/impl/query_impl.cc @@ -434,6 +434,7 @@ bool QueryImpl::ParseValue(const Prop& sel, const QueryToken& op, if (sel.type==Prop::INT) { // todo. Add check to test that the comparison operator is only one of // = and !=. The others don't make too much sense. + if (value_string=="true" || value_string=="True" || value_string=="TRUE") { value=ParamType(int(1)); @@ -444,11 +445,19 @@ bool QueryImpl::ParseValue(const Prop& sel, const QueryToken& op, break; } } + // yes, not having a break here is on purpose case tok::String: if (sel.type!=Prop::STRING) { - error_desc_.msg="'"+sel.GetName()+"' takes "+sel.GetTypeName()+ - " argument, but String literal given"; - error_desc_.range=v.GetValueRange(); + if (sel.id>=Prop::CUSTOM) { + // BZDNG-204: issue specific warning when trying to use a string value + // for a generic property. + error_desc_.msg="only numeric generic properties can be used in queries"; + error_desc_.range=v.GetValueRange(); + } else { + error_desc_.msg="'"+sel.GetName()+"' takes "+sel.GetTypeName()+ + " argument, but string literal given"; + error_desc_.range=v.GetValueRange(); + } return false; } else { value=value_string; @@ -662,7 +671,19 @@ Node* QueryImpl::ParsePropValueExpr(QueryLexer& lexer) { GenProp gen_prop(epm); if (op.GetType()==tok::Colon) { op=lexer.NextToken(); - if (!this->ExpectNumeric(op)) { + if (!this->ExpectNotEnd(op, "value")) { + return NULL; + } + if (tok::FloatingValue!=op.GetType() && + tok::IntegralValue!=op.GetType()) { + // BZDNG-204: issue specific warning when trying to use a string value + // for a generic property. + if (op.GetType()==tok::String || op.GetType()==tok::Identifier) { + error_desc_.msg="only numeric generic properties are supported in queries"; + error_desc_.range=op.GetValueRange(); + return NULL; + } + this->ExpectNumeric(op); return NULL; } gen_prop.default_val=atof(query_string_.substr(op.GetValueRange().Loc, @@ -957,9 +978,10 @@ bool QueryImpl::ExpectNumeric(const QueryToken& token) token.GetRange().Length)+"' found"; error_desc_.range=token.GetRange(); } - return false; + return false; } + Node* QueryImpl::Concatenate(Node* lhs, Node* rhs, LogicOP logical_op) { assert(lhs && "lhs is NULL"); assert(rhs && "rhs is NULL");