connectivity/qa/connectivity/tools/CRMDatabase.java |   42 ------------------
 dbaccess/qa/unit/CRMDatabase_test.cxx               |   46 ++++++++++++++++++++
 dbaccess/qa/unit/dbtest_base.cxx                    |    2 
 3 files changed, 48 insertions(+), 42 deletions(-)

New commits:
commit c48ebfd863f53fd58eb83b086d32d8db3fffabe4
Author:     Adam Seskunas <[email protected]>
AuthorDate: Tue Feb 4 11:29:01 2025 -0800
Commit:     Xisco Fauli <[email protected]>
CommitDate: Thu Feb 13 09:53:08 2025 +0100

    Change the unparseable query to parse ODBC escape query
    
    dbaccess/qa/connectivity/tools/CRMDatabase.java - remove unparseable query
    dbaccess/qa/unit/dbtest_base.cxx - Add the ODBC escape query
    dbacces/qa/unit/CRMDatabase_test.cxx - Add test
    
    The unparseable query has been commented out for a number of
    years in the CRMDatabase.java. At some point, this query has become
    parseable so this commit removes the old commented out Java query,
    moves the it to C++ and adds a CPPUNIT test for the queries parseability.
    
    Change-Id: Ie4d700458bc6dfd52cd87aec75ec202dd12248ef
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/181142
    Tested-by: Jenkins
    Tested-by: Xisco Fauli <[email protected]>
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/connectivity/qa/connectivity/tools/CRMDatabase.java 
b/connectivity/qa/connectivity/tools/CRMDatabase.java
index 3d33926280c3..204b90fa9def 100644
--- a/connectivity/qa/connectivity/tools/CRMDatabase.java
+++ b/connectivity/qa/connectivity/tools/CRMDatabase.java
@@ -203,43 +203,6 @@ public class CRMDatabase
         m_connection.refreshTables();
     }
 
-
-    private void validateUnparseable()
-    {
-    /*
-        // The "unparseable" query should be indeed be unparseable by OOo 
(though a valid HSQL query)
-        XSingleSelectQueryComposer composer;
-        QueryDefinition unparseableQuery;
-        try
-        {
-            final XMultiServiceFactory factory = UnoRuntime.queryInterface(
-                    XMultiServiceFactory.class, 
m_database.defaultConnection().getXConnection() );
-            composer = UnoRuntime.queryInterface(
-                    XSingleSelectQueryComposer.class, factory.createInstance( 
"com.sun.star.sdb.SingleSelectQueryComposer" ) );
-            unparseableQuery = m_dataSource.getQueryDefinition( "unparseable" 
);
-        }
-        catch( Exception e )
-        {
-            throw new RuntimeException( "caught an unexpected exception: " + 
e.getMessage() );
-        }
-
-        boolean caughtExpected = false;
-        try
-        {
-            composer.setQuery( unparseableQuery.getCommand() );
-        }
-        catch (WrappedTargetException e) { }
-        catch( SQLException e )
-        {
-            caughtExpected = true;
-        }
-
-        if ( !caughtExpected )
-            throw new RuntimeException( "Somebody improved the parser! This is 
bad :), since we need an unparsable query here!" );
-            */
-    }
-
-
     private void createQueries() throws ElementExistException, 
WrappedTargetException, com.sun.star.lang.IllegalArgumentException
     {
         m_database.getDataSource().createQuery(
@@ -268,10 +231,5 @@ public class CRMDatabase
 
         m_database.getDataSource().createQuery( "parseable", "SELECT * FROM 
\"customers\"" );
         m_database.getDataSource().createQuery( "parseable native", "SELECT * 
FROM INFORMATION_SCHEMA.SYSTEM_VIEWS", false );
-/*
-        m_database.getDataSource().createQuery( "unparseable",
-            "SELECT {fn DAYOFMONTH ('2001-01-01')} AS \"ID_VARCHAR\" FROM 
\"products\"", false );
-*/
-        validateUnparseable();
     }
 }
diff --git a/dbaccess/qa/unit/CRMDatabase_test.cxx 
b/dbaccess/qa/unit/CRMDatabase_test.cxx
index adb9a9af479b..557be6f0f35d 100644
--- a/dbaccess/qa/unit/CRMDatabase_test.cxx
+++ b/dbaccess/qa/unit/CRMDatabase_test.cxx
@@ -13,11 +13,14 @@
 #include <com/sun/star/container/XNameAccess.hpp>
 #include <com/sun/star/frame/XStorable.hpp>
 #include <com/sun/star/lang/XSingleServiceFactory.hpp>
+#include <com/sun/star/lang/XMultiServiceFactory.hpp>
 #include <com/sun/star/sdb/DatabaseContext.hpp>
 #include <com/sun/star/sdb/XDocumentDataSource.hpp>
 #include <com/sun/star/sdb/XOfficeDatabaseDocument.hpp>
 #include <com/sun/star/sdb/XQueriesSupplier.hpp>
+#include <com/sun/star/sdb/XSingleSelectQueryComposer.hpp>
 #include <com/sun/star/sdbc/XDataSource.hpp>
+#include <com/sun/star/sdbc/SQLException.hpp>
 #include <com/sun/star/sdbcx/XColumnsSupplier.hpp>
 #include <com/sun/star/sdbc/XResultSet.hpp>
 #include <com/sun/star/sdbc/XRow.hpp>
@@ -33,11 +36,13 @@ public:
     void testRegistrationName();
     uno::Reference<XConnection> setUpDBConnection();
     void testQueryColumns();
+    void testODBCEscapeQuery();
 
     CPPUNIT_TEST_SUITE(CRMDBTest);
     CPPUNIT_TEST(testCRMDatabase);
     CPPUNIT_TEST(testRegistrationName);
     CPPUNIT_TEST(testQueryColumns);
+    CPPUNIT_TEST(testODBCEscapeQuery);
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -180,6 +185,47 @@ void CRMDBTest::testQueryColumns()
     }
 }
 
+void CRMDBTest::testODBCEscapeQuery()
+{
+    uno::Reference<XConnection> xConnection = setUpDBConnection();
+    createTables(xConnection);
+
+    uno::Reference<lang::XMultiServiceFactory> xFactory(xConnection, 
UNO_QUERY);
+    CPPUNIT_ASSERT(xFactory.is());
+
+    Reference<XSingleSelectQueryComposer> xComposer(
+        
xFactory->createInstance(u"com.sun.star.sdb.SingleSelectQueryComposer"_ustr),
+        UNO_QUERY_THROW);
+
+    uno::Reference<XQueriesSupplier> xQuerySupplier(xConnection, 
UNO_QUERY_THROW);
+    uno::Reference<container::XNameAccess> xQueryAccess = 
xQuerySupplier->getQueries();
+    CPPUNIT_ASSERT(xQueryAccess->hasElements());
+
+    Reference<XPropertySet> xQuery(xQueryAccess->getByName(u"parse odbc 
escape"_ustr), UNO_QUERY);
+    OUString sQuery;
+    xQuery->getPropertyValue(u"Command"_ustr) >>= sQuery;
+
+    // Test to make sure the query is parseable
+    // If it is unparseable, catch the SQLException and fail with the SQL 
error mesage
+    try
+    {
+        xComposer->setQuery(sQuery);
+    }
+    catch (const SQLException& e)
+    {
+        OString oMessage = OUStringToOString(e.Message, 
RTL_TEXTENCODING_ASCII_US);
+        CPPUNIT_ASSERT_MESSAGE(oMessage.getStr(), false);
+    }
+
+    Reference<XStatement> xStatement = xConnection->createStatement();
+    Reference<XResultSet> xResults = 
xStatement->executeQuery(xComposer->getQuery());
+    CPPUNIT_ASSERT(xResults.is());
+
+    // Check to make sure the query returns the correct result
+    Reference<XRow> xRow(xResults, UNO_QUERY_THROW);
+    CPPUNIT_ASSERT(xResults->next());
+    CPPUNIT_ASSERT_EQUAL(u"1"_ustr, xRow->getString(1));
+}
 CPPUNIT_TEST_SUITE_REGISTRATION(CRMDBTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/dbaccess/qa/unit/dbtest_base.cxx b/dbaccess/qa/unit/dbtest_base.cxx
index f33a29958ee2..bec6e6817ca1 100644
--- a/dbaccess/qa/unit/dbtest_base.cxx
+++ b/dbaccess/qa/unit/dbtest_base.cxx
@@ -162,6 +162,8 @@ void DBTestBase::createQueries(const 
Reference<XDataSource>& xDataSource)
 
     createQuery(u"SELECT * FROM \"CUSTOMERS\""_ustr, true, u"parseable"_ustr, 
xDataSource);
     createQuery(u"SELECT * FROM INFORMATION_SCHEMA.SYSTEM_VIEWS"_ustr, false, 
u"parseable native"_ustr, xDataSource);
+    createQuery(u"SELECT {fn DAYOFMONTH ('2001-01-01')} AS \"ID_VARCHAR\" FROM 
\"PRODUCTS\""_ustr,
+                false, u"parse odbc escape"_ustr, xDataSource);
 }
 
 void DBTestBase::createQuery(const OUString& sQuery, bool bEscapeProcessing, 
const OUString& sQueryName, const Reference<XDataSource> & xDataSource)

Reply via email to