Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -213,11 +213,14 @@ size_t FlightSqlResultSetMetadata::GetOctetLength(int column_position) {
.value_or(DefaultLengthForVariableLengthColumns);
}

std::string FlightSqlResultSetMetadata::GetTypeName(int column_position) {
std::string FlightSqlResultSetMetadata::GetTypeName(int column_position, int data_type) {
arrow::flight::sql::ColumnMetadata metadata =
GetMetadata(schema_->field(column_position - 1));

return metadata.GetTypeName().ValueOrElse([] { return ""; });
return metadata.GetTypeName().ValueOrElse([data_type] {
// If we get an empty type name, figure out the type name from the data_type.
return driver::flight_sql::GetTypeNameFromSqlDataType(data_type);
});
}

driver::odbcabstraction::Updatability FlightSqlResultSetMetadata::GetUpdatable(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ class FlightSqlResultSetMetadata : public odbcabstraction::ResultSetMetadata {

size_t GetOctetLength(int column_position) override;

std::string GetTypeName(int column_position) override;
std::string GetTypeName(int column_position, int data_type) override;

odbcabstraction::Updatability GetUpdatable(int column_position) override;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ class ResultSetMetadata {
/// \brief It returns the data type as a string.
/// \param column_position [in] the position of the column, starting from 1.
/// \return the data type string.
virtual std::string GetTypeName(int column_position) = 0;
virtual std::string GetTypeName(int column_position, int data_type) = 0;

/// \brief It returns a numeric values indicate the updatability of the
/// column.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,8 @@ void ODBCDescriptor::PopulateFromResultSetMetadata(ResultSetMetadata* rsmd) {

for (size_t i = 0; i < m_records.size(); ++i) {
size_t oneBasedIndex = i + 1;
int16_t concise_type = rsmd->GetConciseType(oneBasedIndex);

m_records[i].m_baseColumnName = rsmd->GetBaseColumnName(oneBasedIndex);
m_records[i].m_baseTableName = rsmd->GetBaseTableName(oneBasedIndex);
m_records[i].m_catalogName = rsmd->GetCatalogName(oneBasedIndex);
Expand All @@ -492,9 +494,8 @@ void ODBCDescriptor::PopulateFromResultSetMetadata(ResultSetMetadata* rsmd) {
m_records[i].m_name = rsmd->GetName(oneBasedIndex);
m_records[i].m_schemaName = rsmd->GetSchemaName(oneBasedIndex);
m_records[i].m_tableName = rsmd->GetTableName(oneBasedIndex);
m_records[i].m_typeName = rsmd->GetTypeName(oneBasedIndex);
m_records[i].m_conciseType =
GetSqlTypeForODBCVersion(rsmd->GetConciseType(oneBasedIndex), m_is2xConnection);
m_records[i].m_typeName = rsmd->GetTypeName(oneBasedIndex, concise_type);
m_records[i].m_conciseType = GetSqlTypeForODBCVersion(concise_type, m_is2xConnection);
m_records[i].m_dataPtr = nullptr;
m_records[i].m_indicatorPtr = nullptr;
m_records[i].m_displaySize = rsmd->GetColumnDisplaySize(oneBasedIndex);
Expand Down
82 changes: 67 additions & 15 deletions cpp/src/arrow/flight/sql/odbc/tests/columns_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -286,14 +286,18 @@ void checkSQLColAttributes(SQLHSTMT stmt, SQLUSMALLINT idx,
void checkSQLColAttributeString(SQLHSTMT stmt, const std::wstring& wsql, SQLUSMALLINT idx,
SQLUSMALLINT fieldIdentifier,
const std::wstring& expectedAttrString) {
// Execute query and check SQLColAttribute string attribute
std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
SQLRETURN ret = SQLExecDirect(stmt, &sql0[0], static_cast<SQLINTEGER>(sql0.size()));
EXPECT_EQ(ret, SQL_SUCCESS);
SQLRETURN ret;
if (!wsql.empty()) {
// Execute query
std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
ret = SQLExecDirect(stmt, &sql0[0], static_cast<SQLINTEGER>(sql0.size()));
EXPECT_EQ(ret, SQL_SUCCESS);

ret = SQLFetch(stmt);
EXPECT_EQ(ret, SQL_SUCCESS);
ret = SQLFetch(stmt);
EXPECT_EQ(ret, SQL_SUCCESS);
}

// check SQLColAttribute string attribute
std::vector<SQLWCHAR> strVal(ODBC_BUFFER_SIZE);
SQLSMALLINT strLen = 0;

Expand Down Expand Up @@ -326,14 +330,18 @@ void checkSQLColAttributeNumeric(SQLHSTMT stmt, const std::wstring& wsql,
void checkSQLColAttributesString(SQLHSTMT stmt, const std::wstring& wsql,
SQLUSMALLINT idx, SQLUSMALLINT fieldIdentifier,
const std::wstring& expectedAttrString) {
// Execute query and check ODBC 2.0 API SQLColAttributes string attribute
std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
SQLRETURN ret = SQLExecDirect(stmt, &sql0[0], static_cast<SQLINTEGER>(sql0.size()));
EXPECT_EQ(ret, SQL_SUCCESS);
SQLRETURN ret;
if (!wsql.empty()) {
// Execute query
std::vector<SQLWCHAR> sql0(wsql.begin(), wsql.end());
ret = SQLExecDirect(stmt, &sql0[0], static_cast<SQLINTEGER>(sql0.size()));
EXPECT_EQ(ret, SQL_SUCCESS);

ret = SQLFetch(stmt);
EXPECT_EQ(ret, SQL_SUCCESS);
ret = SQLFetch(stmt);
EXPECT_EQ(ret, SQL_SUCCESS);
}

// check ODBC 2.0 API SQLColAttributes string attribute
std::vector<SQLWCHAR> strVal(ODBC_BUFFER_SIZE);
SQLSMALLINT strLen = 0;

Expand Down Expand Up @@ -2247,8 +2255,14 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLColAttributeTypeName) {
this->CreateTableAllDataType();
Comment thread
alinaliBQ marked this conversation as resolved.
Outdated

std::wstring wsql = L"SELECT * from AllTypesTable;";
// Mock server doesn't return data source-dependent data type name
checkSQLColAttributeString(this->stmt, wsql, 1, SQL_DESC_TYPE_NAME, std::wstring(L""));
checkSQLColAttributeString(this->stmt, wsql, 1, SQL_DESC_TYPE_NAME,
std::wstring(L"BIGINT"));
checkSQLColAttributeString(this->stmt, L"", 2, SQL_DESC_TYPE_NAME,
std::wstring(L"WVARCHAR"));
checkSQLColAttributeString(this->stmt, L"", 3, SQL_DESC_TYPE_NAME,
std::wstring(L"BINARY"));
checkSQLColAttributeString(this->stmt, L"", 4, SQL_DESC_TYPE_NAME,
std::wstring(L"DOUBLE"));

this->disconnect();
}
Expand All @@ -2259,6 +2273,22 @@ TEST_F(FlightSQLODBCRemoteTestBase, TestSQLColAttributeTypeName) {
std::wstring wsql = L"SELECT * from $scratch.ODBCTest;";
checkSQLColAttributeString(this->stmt, wsql, 1, SQL_DESC_TYPE_NAME,
std::wstring(L"INTEGER"));
checkSQLColAttributeString(this->stmt, L"", 2, SQL_DESC_TYPE_NAME,
std::wstring(L"BIGINT"));
checkSQLColAttributeString(this->stmt, L"", 3, SQL_DESC_TYPE_NAME,
std::wstring(L"DECIMAL"));
checkSQLColAttributeString(this->stmt, L"", 4, SQL_DESC_TYPE_NAME,
std::wstring(L"FLOAT"));
checkSQLColAttributeString(this->stmt, L"", 5, SQL_DESC_TYPE_NAME,
std::wstring(L"DOUBLE"));
checkSQLColAttributeString(this->stmt, L"", 6, SQL_DESC_TYPE_NAME,
std::wstring(L"BOOLEAN"));
checkSQLColAttributeString(this->stmt, L"", 7, SQL_DESC_TYPE_NAME,
std::wstring(L"DATE"));
checkSQLColAttributeString(this->stmt, L"", 8, SQL_DESC_TYPE_NAME,
std::wstring(L"TIME"));
checkSQLColAttributeString(this->stmt, L"", 9, SQL_DESC_TYPE_NAME,
std::wstring(L"TIMESTAMP"));

this->disconnect();
}
Expand All @@ -2271,7 +2301,13 @@ TEST_F(FlightSQLODBCMockTestBase, TestSQLColAttributesTypeName) {
std::wstring wsql = L"SELECT * from AllTypesTable;";
// Mock server doesn't return data source-dependent data type name
checkSQLColAttributesString(this->stmt, wsql, 1, SQL_COLUMN_TYPE_NAME,
std::wstring(L""));
std::wstring(L"BIGINT"));
checkSQLColAttributesString(this->stmt, L"", 2, SQL_COLUMN_TYPE_NAME,
std::wstring(L"WVARCHAR"));
checkSQLColAttributesString(this->stmt, L"", 3, SQL_COLUMN_TYPE_NAME,
std::wstring(L"BINARY"));
checkSQLColAttributesString(this->stmt, L"", 4, SQL_COLUMN_TYPE_NAME,
std::wstring(L"DOUBLE"));

this->disconnect();
}
Expand All @@ -2283,6 +2319,22 @@ TEST_F(FlightSQLODBCRemoteTestBase, TestSQLColAttributesTypeName) {
std::wstring wsql = L"SELECT * from $scratch.ODBCTest;";
checkSQLColAttributesString(this->stmt, wsql, 1, SQL_COLUMN_TYPE_NAME,
std::wstring(L"INTEGER"));
checkSQLColAttributesString(this->stmt, L"", 2, SQL_COLUMN_TYPE_NAME,
std::wstring(L"BIGINT"));
checkSQLColAttributesString(this->stmt, L"", 3, SQL_COLUMN_TYPE_NAME,
std::wstring(L"DECIMAL"));
checkSQLColAttributesString(this->stmt, L"", 4, SQL_COLUMN_TYPE_NAME,
std::wstring(L"FLOAT"));
checkSQLColAttributesString(this->stmt, L"", 5, SQL_COLUMN_TYPE_NAME,
std::wstring(L"DOUBLE"));
checkSQLColAttributesString(this->stmt, L"", 6, SQL_COLUMN_TYPE_NAME,
std::wstring(L"BOOLEAN"));
checkSQLColAttributesString(this->stmt, L"", 7, SQL_COLUMN_TYPE_NAME,
std::wstring(L"DATE"));
checkSQLColAttributesString(this->stmt, L"", 8, SQL_COLUMN_TYPE_NAME,
std::wstring(L"TIME"));
checkSQLColAttributesString(this->stmt, L"", 9, SQL_COLUMN_TYPE_NAME,
std::wstring(L"TIMESTAMP"));

this->disconnect();
}
Expand Down
Loading