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();