From 260f538de3ab24ac8768fa66892b41984fe6aacd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Thu, 14 Jan 2021 08:49:48 +0100 Subject: [PATCH] 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. --- YACReaderLibrary/db/query_parser.cpp | 17 +++++++++-------- YACReaderLibrary/db/query_parser.h | 5 +++++ 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/YACReaderLibrary/db/query_parser.cpp b/YACReaderLibrary/db/query_parser.cpp index 5a10d238..38381e5c 100644 --- a/YACReaderLibrary/db/query_parser.cpp +++ b/YACReaderLibrary/db/query_parser.cpp @@ -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, ":"), {}) }); } diff --git a/YACReaderLibrary/db/query_parser.h b/YACReaderLibrary/db/query_parser.h index aa688fc2..7aca5ca9 100644 --- a/YACReaderLibrary/db/query_parser.h +++ b/YACReaderLibrary/db/query_parser.h @@ -45,6 +45,11 @@ public: std::string t; std::vector children; + explicit TreeNode(std::string t, std::vector children) + : t(t), children(children) + { + } + int buildSqlString(std::string &sqlString, int bindPosition = 0) const; int bindValues(QSqlQuery &selectQuery, int bindPosition = 0) const; };