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.heinisch@yahoo.de>
diff --git a/connectivity/source/drivers/firebird/ResultSetMetaData.cxx b/connectivity/source/drivers/firebird/ResultSetMetaData.cxx
index 78d684a..5653d29 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 0000000..8cee7bc
--- /dev/null
+++ b/dbaccess/qa/unit/data/tdf132924.odb
Binary files differ
diff --git a/dbaccess/qa/unit/firebird.cxx b/dbaccess/qa/unit/firebird.cxx
index e67a4d1..7a81438 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();