Browse Source

fix(SQLParser): Disable SQL parsing by default #4462

Alex Fabijanic 2 năm trước cách đây
mục cha
commit
2fe694e4d3

+ 26 - 0
.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

+ 13 - 1
Data/include/Poco/Data/AbstractSessionImpl.h

@@ -56,7 +56,7 @@ public:
 			_bulk(false),
 			_emptyStringIsNull(false),
 			_forceEmptyString(false),
-			_sqlParse(true),
+			_sqlParse(false),
 			_autoCommit(true)
 		/// Creates the AbstractSessionImpl.
 		///
@@ -90,6 +90,18 @@ public:
 		/// 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<C>::setStorage,

+ 22 - 10
Data/include/Poco/Data/Statement.h

@@ -33,16 +33,23 @@
 #include "Poco/Optional.h"
 #include <algorithm>
 
+#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 @@ public:
 
 	Optional<std::size_t> 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<bool> parse();
 		/// Parses the SQL statement and returns true if successful.
@@ -319,42 +328,44 @@ public:
 		/// 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<bool> 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<bool> 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<bool> 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<bool> 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<bool> 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<bool> 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<bool> 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<bool> 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 @@ private:
 
 	Poco::SharedPtr<Parser::SQLParserResult> _pParseResult;
 	std::string _parseError;
-#endif //  POCO_DATA_NO_SQL_PARSER
+
+#endif // POCO_DATA_NO_SQL_PARSER
 
 	StatementImpl::Ptr _pImpl;
 

+ 2 - 0
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"

+ 2 - 3
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=<path>
     Compile with -DPOCO_DATA_SQLITE_FTS.