Use an explicit constructor for TreeNode

List initialization ended using movable constructors which surprisingly caused data troubles in release mode, at least in VC2019 compiler. The tree being messed up caused crashes while SQL was generated.

I have no explanation for it.
This commit is contained in:
Luis Ángel San Martín 2021-01-14 08:49:48 +01:00
parent f09c5955d8
commit 260f538de3
2 changed files with 14 additions and 8 deletions

View File

@ -168,7 +168,7 @@ QueryParser::TreeNode QueryParser::orExpression()
auto lhs = andExpression();
if (lcaseToken() == "or") {
advance();
return { "or", { lhs, orExpression() } };
return TreeNode("or", { lhs, orExpression() });
}
return lhs;
}
@ -178,11 +178,11 @@ QueryParser::TreeNode QueryParser::andExpression()
auto lhs = notExpression();
if (lcaseToken() == "and") {
advance();
return { "and", { lhs, andExpression() } };
return TreeNode("and", { lhs, andExpression() });
}
if ((isIn(tokenType(), { Token::Type::word, Token::Type::quotedWord }) || token() == "(") && lcaseToken() != "or") {
return { "and", { lhs, andExpression() } };
return TreeNode("and", { lhs, andExpression() });
}
return lhs;
@ -192,7 +192,7 @@ QueryParser::TreeNode QueryParser::notExpression()
{
if (lcaseToken() == "not") {
advance();
return { "not", { notExpression() } };
return TreeNode("not", { notExpression() });
}
return locationExpression();
}
@ -216,7 +216,7 @@ QueryParser::TreeNode QueryParser::locationExpression()
QueryParser::TreeNode QueryParser::baseToken()
{
if (tokenType() == Token::Type::quotedWord) {
return { "token", { { "all", {} }, { token(true), {} } } };
return TreeNode("token", { TreeNode("all", {}), TreeNode(token(true), {}) });
}
auto words(split(token(true), ':'));
@ -225,9 +225,10 @@ QueryParser::TreeNode QueryParser::baseToken()
auto loc(toLower(words[0].toStdString()));
words.erase(words.begin());
if (words.size() == 1 && tokenType() == Token::Type::quotedWord) {
return { "token", { { loc, {} }, { token(true), {} } } };
return TreeNode("token", { TreeNode(loc, {}), TreeNode(token(true), {}) });
}
return { "token", { { loc, {} }, { join(words, ":"), {} } } };
return TreeNode("token", { TreeNode(loc, {}), TreeNode(join(words, ":"), {}) });
}
return { "token", { { "all", {} }, { join(words, ":"), {} } } };
return TreeNode("token", { TreeNode("all", {}), TreeNode(join(words, ":"), {}) });
}

View File

@ -45,6 +45,11 @@ public:
std::string t;
std::vector<TreeNode> children;
explicit TreeNode(std::string t, std::vector<TreeNode> children)
: t(t), children(children)
{
}
int buildSqlString(std::string &sqlString, int bindPosition = 0) const;
int bindValues(QSqlQuery &selectQuery, int bindPosition = 0) const;
};