From 2fe694e4d30e9daeb84f3c7367fff14cf12ef915 Mon Sep 17 00:00:00 2001 From: Alex Fabijanic Date: Thu, 15 Feb 2024 15:07:56 +0100 Subject: [PATCH] fix(SQLParser): Disable SQL parsing by default #4462 --- .github/workflows/ci.yml | 26 ++++++++++++++++ Data/include/Poco/Data/AbstractSessionImpl.h | 14 ++++++++- Data/include/Poco/Data/Statement.h | 32 ++++++++++++++------ Data/src/Statement.cpp | 2 ++ configure | 5 ++- 5 files changed, 65 insertions(+), 14 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a143b35d40..eb48354baa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -725,3 +725,29 @@ jobs: sudo -s EXCLUDE_TESTS="ActiveRecord ApacheConnector CppParser CppUnit Crypto Data Data/MySQL Data/PostgreSQL Data/SQLite Encodings Foundation JSON JWT MongoDB Net NetSSL_OpenSSL NetSSL_Win PDF PageCompiler PocoDoc ProGen Prometheus Redis SevenZip Util XML Zip" ./ci/runtests.sh + + linux-gcc-make-sqlite-no-sqlparser: + runs-on: ubuntu-22.04 + services: + mysql: + image: mysql:8.1.0 + env: + MYSQL_ALLOW_EMPTY_PASSWORD: yes + MYSQL_USER: pocotest + MYSQL_PASSWORD: pocotest + MYSQL_DATABASE: pocotest + ports: + - 3306:3306 + steps: + - uses: actions/checkout@v3 + - run: sudo apt -y update + - run: ./configure --everything --no-samples --no-sqlparser --omit=ActiveRecord,ApacheConnector,CppParser,Crypto,Data/PostgreSQL,Data/MySQL,Data/ODBC,Encodings,JSON,JWT,MongoDB,Net,NetSSL_OpenSSL,NetSSL_Win,PDF,PageCompiler,PocoDoc,ProGen,Prometheus,Redis,SevenZip,Util,XML,Zip && make all -s -j4 && sudo make install + - uses: ./.github/actions/retry-action + with: + timeout_minutes: 90 + max_attempts: 3 + retry_on: any + command: >- + sudo -s + EXCLUDE_TESTS="ActiveRecord ApacheConnector CppParser CppUnit Crypto Data Data/PostgreSQL Data/ODBC Data/MySQL Encodings Foundation JSON JWT MongoDB Net NetSSL_OpenSSL NetSSL_Win PDF PageCompiler PocoDoc ProGen Prometheus Redis SevenZip Util XML Zip" + ./ci/runtests.sh diff --git a/Data/include/Poco/Data/AbstractSessionImpl.h b/Data/include/Poco/Data/AbstractSessionImpl.h index 0fdfa92993..572a80d704 100644 --- a/Data/include/Poco/Data/AbstractSessionImpl.h +++ b/Data/include/Poco/Data/AbstractSessionImpl.h @@ -56,7 +56,7 @@ class AbstractSessionImpl: public SessionImpl _bulk(false), _emptyStringIsNull(false), _forceEmptyString(false), - _sqlParse(true), + _sqlParse(false), _autoCommit(true) /// Creates the AbstractSessionImpl. /// @@ -90,6 +90,18 @@ class AbstractSessionImpl: public SessionImpl /// While these features can not both be true at the same time, they can both be false, /// resulting in default underlying database behavior. /// + /// Adds "sqlParse" feature and sets it to false; this property enables parsing of the SQL queries, + /// to help the Data framework to determine whether to start a transaction automatically in + /// non-autocomit mode (ie. not to start transaction if all the queries in an SQL statement are SELECTs). + /// Note that the property is not a bullet-proof way to ensure this behavior, because not all SQL dialects + /// are supported by the parser. When enabled, the parsing has performance cost, but it is otherwise + /// non-intrusive, ie. on parse failure Statement only internally records parsing errors, but does not throw. + /// See Poco::Data::Statement documentation for more information. + /// This property has no effect when Poco::Data library is compiled with POCO_DATA_NO_SQL_PARSER. + /// + /// Adds "autoCommit" feature and sets it to true. This property enables automatic commit. + /// Setting this feature to true renders the `sqlParse` property meaningless, because every query + /// is automatically commited. { addProperty("storage", &AbstractSessionImpl::setStorage, diff --git a/Data/include/Poco/Data/Statement.h b/Data/include/Poco/Data/Statement.h index e39edc2685..c3a4164b8d 100644 --- a/Data/include/Poco/Data/Statement.h +++ b/Data/include/Poco/Data/Statement.h @@ -33,16 +33,23 @@ #include "Poco/Optional.h" #include +#ifndef POCO_DATA_NO_SQL_PARSER namespace hsql { class SQLParserResult; } +#endif // POCO_DATA_NO_SQL_PARSER + namespace Poco { namespace Data { +#ifndef POCO_DATA_NO_SQL_PARSER + namespace Parser = hsql; // namespace Poco::Data::Parser +#endif // POCO_DATA_NO_SQL_PARSER + class AbstractBinding; class AbstractExtraction; class Session; @@ -311,6 +318,8 @@ class Data_API Statement Optional statementsCount() const; /// Returns the total number of SQL statements held in the accummulated SQL statement. + /// + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. Optional parse(); /// Parses the SQL statement and returns true if successful. @@ -319,42 +328,44 @@ class Data_API Statement /// keywords not supported by the parser. Parsing failures are silent in terms of /// throwing exceptions or logging, but it is possible to get error information by /// calling parseError(). + /// + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. const std::string& parseError(); /// Returns the SQL statement parse error message, if any. - /// For Poco::Data builds without SQLParser, it always returns empty string. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns an empty string. Optional isSelect() const; /// Returns true if the statement consists only of SELECT statement(s). - /// For Poco::Data builds without SQLParser, it always returns unspecified. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. Optional isInsert() const; /// Returns true if the statement consists only of INSERT statement(s). - /// For Poco::Data builds without SQLParser, it always returns unspecified. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. Optional isUpdate() const; /// Returns true if the statement consists only of UPDATE statement(s). - /// For Poco::Data builds without SQLParser, it always returns unspecified. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. Optional isDelete() const; /// Returns true if the statement consists only of DELETE statement(s). - /// For Poco::Data builds without SQLParser, it always returns unspecified. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. Optional hasSelect() const; /// Returns true if the statement contains a SELECT statement. - /// For Poco::Data builds without SQLParser, it always returns unspecified. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. Optional hasInsert() const; /// Returns true if the statement contains an INSERT statement. - /// For Poco::Data builds without SQLParser, it always returns unspecified. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. Optional hasUpdate() const; /// Returns true if the statement contains an UPDATE statement. - /// For Poco::Data builds without SQLParser, it always returns unspecified. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. Optional hasDelete() const; /// Returns true if the statement contains a DELETE statement. - /// For Poco::Data builds without SQLParser, it always returns unspecified. + /// For Poco::Data builds with POCO_DATA_NO_SQL_PARSER, it always returns unspecified. std::size_t execute(bool reset = true); /// Executes the statement synchronously or asynchronously. @@ -549,7 +560,8 @@ class Data_API Statement Poco::SharedPtr _pParseResult; std::string _parseError; -#endif // POCO_DATA_NO_SQL_PARSER + +#endif // POCO_DATA_NO_SQL_PARSER StatementImpl::Ptr _pImpl; diff --git a/Data/src/Statement.cpp b/Data/src/Statement.cpp index 0790e1c195..0546b05247 100644 --- a/Data/src/Statement.cpp +++ b/Data/src/Statement.cpp @@ -12,7 +12,9 @@ // +#ifndef POCO_DATA_NO_SQL_PARSER #include "SQLParser.h" +#endif #include "Poco/Data/Statement.h" #include "Poco/Data/DataException.h" #include "Poco/Data/Extraction.h" diff --git a/configure b/configure index b9d020d568..1ceeebeeeb 100755 --- a/configure +++ b/configure @@ -79,9 +79,8 @@ $(ls -C "$base"/build/config/) Disables small object optimization. --no-sqlparser - Compile with POCO_DATA_NO_SQL_PARSER - SQLParser is not enabled by default for c++14 and below, - so this option only has meaning for c++17 and above. + Compile with -DPOCO_DATA_NO_SQL_PARSER + Disables compilation of the SQLParser. --sqlite-fts= Compile with -DPOCO_DATA_SQLITE_FTS.