connectivity/source/drivers/firebird/ResultSetMetaData.cxx |   12 ++++-
 dbaccess/qa/unit/data/tdf132924.odb                        |binary
 dbaccess/qa/unit/firebird.cxx                              |   28 +++++++++++++
 3 files changed, 37 insertions(+), 3 deletions(-)

New commits:
commit 4590048952a9e62124641c512dc2d19122f7fb2d
Author:     Andreas Heinisch <andreas.heini...@yahoo.de>
AuthorDate: Wed Mar 23 21:14:46 2022 +0100
Commit:     Andreas Heinisch <andreas.heini...@yahoo.de>
CommitDate: Fri Mar 25 13:37:57 2022 +0100

    tdf#132924 - Firebird findColumn: return column alias if specified
    
    The function findColumn in a Basic macro should also find aliases for
    columns specified in an SQL query using a Firebird database.
    
    Change-Id: I96adb2564da1e18cee58f1c6803526d8ff4deabb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131990
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <andreas.heini...@yahoo.de>

diff --git a/connectivity/source/drivers/firebird/ResultSetMetaData.cxx 
b/connectivity/source/drivers/firebird/ResultSetMetaData.cxx
index 78d684a725a2..5653d29c4211 100644
--- a/connectivity/source/drivers/firebird/ResultSetMetaData.cxx
+++ b/connectivity/source/drivers/firebird/ResultSetMetaData.cxx
@@ -128,9 +128,15 @@ OUString SAL_CALL 
OResultSetMetaData::getSchemaName(sal_Int32)
 OUString SAL_CALL OResultSetMetaData::getColumnName(sal_Int32 column)
 {
     verifyValidColumn(column);
-    OUString sRet(m_pSqlda->sqlvar[column-1].sqlname,
-                    m_pSqlda->sqlvar[column-1].sqlname_length,
-                    RTL_TEXTENCODING_UTF8);
+    char* pColumnName = m_pSqlda->sqlvar[column - 1].sqlname;
+    sal_Int32 nColumnNameLength = m_pSqlda->sqlvar[column - 1].sqlname_length;
+    // tdf#132924 - return column alias if specified
+    if (m_pSqlda->sqlvar[column - 1].aliasname_length > 0)
+    {
+        pColumnName = m_pSqlda->sqlvar[column - 1].aliasname;
+        nColumnNameLength = m_pSqlda->sqlvar[column - 1].aliasname_length;
+    }
+    OUString sRet(pColumnName, nColumnNameLength, RTL_TEXTENCODING_UTF8);
     sanitizeIdentifier(sRet);
     return sRet;
 }
diff --git a/dbaccess/qa/unit/data/tdf132924.odb 
b/dbaccess/qa/unit/data/tdf132924.odb
new file mode 100644
index 000000000000..8cee7bcbabfd
Binary files /dev/null and b/dbaccess/qa/unit/data/tdf132924.odb differ
diff --git a/dbaccess/qa/unit/firebird.cxx b/dbaccess/qa/unit/firebird.cxx
index e67a4d10c097..7a8143810097 100644
--- a/dbaccess/qa/unit/firebird.cxx
+++ b/dbaccess/qa/unit/firebird.cxx
@@ -27,10 +27,12 @@ class FirebirdTest
 public:
     void testEmptyDBConnection();
     void testIntegerDatabase();
+    void testTdf132924();
 
     CPPUNIT_TEST_SUITE(FirebirdTest);
     CPPUNIT_TEST(testEmptyDBConnection);
     CPPUNIT_TEST(testIntegerDatabase);
+    CPPUNIT_TEST(testTdf132924);
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -90,6 +92,32 @@ void FirebirdTest::testIntegerDatabase()
     closeDocument(uno::Reference<lang::XComponent>(xDocument, uno::UNO_QUERY));
 }
 
+void FirebirdTest::testTdf132924()
+{
+    uno::Reference<XOfficeDatabaseDocument> xDocument = 
getDocumentForFileName(u"tdf132924.odb");
+    uno::Reference<XConnection> xConnection = 
getConnectionForDocument(xDocument);
+
+    uno::Reference<XStatement> xStatement = xConnection->createStatement();
+    CPPUNIT_ASSERT(xStatement.is());
+
+    uno::Reference<XResultSet> xResultSet = xStatement->executeQuery("SELECT * 
FROM AliasTest");
+    CPPUNIT_ASSERT(xResultSet.is());
+    CPPUNIT_ASSERT(xResultSet->next());
+
+    uno::Reference<XRow> xRow(xResultSet, UNO_QUERY);
+    CPPUNIT_ASSERT(xRow.is());
+    uno::Reference<XColumnLocate> xColumnLocate(xRow, UNO_QUERY);
+    CPPUNIT_ASSERT(xColumnLocate.is());
+
+    // Without the fix in place, this test would have failed with:
+    // - Expected: 1
+    // - Actual  : The column name 'TestId' is not valid
+    CPPUNIT_ASSERT_EQUAL(sal_Int16(1), 
xRow->getShort(xColumnLocate->findColumn("TestId")));
+    CPPUNIT_ASSERT_EQUAL(OUString("TestName"), 
xRow->getString(xColumnLocate->findColumn("TestName")));
+
+    closeDocument(uno::Reference<lang::XComponent>(xDocument, uno::UNO_QUERY));
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(FirebirdTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();

Reply via email to