Skip to content
Draft
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
56 changes: 54 additions & 2 deletions cpp/src/arrow/flight/sql/odbc/odbc_api.cc
Original file line number Diff line number Diff line change
Expand Up @@ -960,8 +960,60 @@ SQLRETURN SQLGetTypeInfo(SQLHSTMT stmt, SQLSMALLINT data_type) {
// appropriate data types in `SEARCHABLE` field
ARROW_LOG(DEBUG) << "SQLGetTypeInfoW called with stmt: " << stmt
<< " data_type: " << data_type;
// GH-47722 TODO: Implement SQLGetTypeInfo
return SQL_INVALID_HANDLE;

using ODBC::ODBCStatement;
return ODBC::ODBCStatement::ExecuteWithDiagnostics(stmt, SQL_ERROR, [=]() {
ODBCStatement* statement = reinterpret_cast<ODBCStatement*>(stmt);

switch (data_type) {
case SQL_ALL_TYPES:
case SQL_CHAR:
case SQL_VARCHAR:
case SQL_LONGVARCHAR:
case SQL_WCHAR:
case SQL_WVARCHAR:
case SQL_WLONGVARCHAR:
case SQL_BIT:
case SQL_BINARY:
case SQL_VARBINARY:
case SQL_LONGVARBINARY:
case SQL_TINYINT:
case SQL_SMALLINT:
case SQL_INTEGER:
case SQL_BIGINT:
case SQL_NUMERIC:
case SQL_DECIMAL:
case SQL_FLOAT:
case SQL_REAL:
case SQL_DOUBLE:
case SQL_GUID:
case SQL_DATE:
case SQL_TYPE_DATE:
case SQL_TIME:
case SQL_TYPE_TIME:
case SQL_TIMESTAMP:
case SQL_TYPE_TIMESTAMP:
case SQL_INTERVAL_DAY:
case SQL_INTERVAL_DAY_TO_HOUR:
case SQL_INTERVAL_DAY_TO_MINUTE:
case SQL_INTERVAL_DAY_TO_SECOND:
case SQL_INTERVAL_HOUR:
case SQL_INTERVAL_HOUR_TO_MINUTE:
case SQL_INTERVAL_HOUR_TO_SECOND:
case SQL_INTERVAL_MINUTE:
case SQL_INTERVAL_MINUTE_TO_SECOND:
case SQL_INTERVAL_SECOND:
case SQL_INTERVAL_YEAR:
case SQL_INTERVAL_YEAR_TO_MONTH:
case SQL_INTERVAL_MONTH:
statement->GetTypeInfo(data_type);
break;
default:
throw DriverException("Invalid SQL data type", "HY004");
}

return SQL_SUCCESS;
});
}

SQLRETURN SQLNativeSql(SQLHDBC conn, SQLWCHAR* in_statement_text,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,24 +108,27 @@ Result<std::shared_ptr<RecordBatch>> TransformInner(
data.literal_suffix = reader.GetLiteralSuffix();

const auto& create_params = reader.GetCreateParams();
if (create_params) {
if (create_params && !create_params->empty()) {
// GH-48093 TODO: replace boost-algorithm with alternatives
data.create_params = boost::algorithm::join(*create_params, ",");
} else {
data.create_params = nullopt;
}

data.nullable = reader.GetNullable() ? NULLABILITY_NULLABLE : NULLABILITY_NO_NULLS;
data.case_sensitive = reader.GetCaseSensitive();
// GH-47237 return SEARCHABILITY_LIKE_ONLY and SEARCHABILITY_ALL_EXPECT_LIKE for
// appropriate data types
data.searchable = reader.GetSearchable() ? SEARCHABILITY_ALL : SEARCHABILITY_NONE;
data.unsigned_attribute = reader.GetUnsignedAttribute();
data.fixed_prec_scale = reader.GetFixedPrecScale();
data.auto_unique_value = reader.GetAutoIncrement();
data.local_type_name = reader.GetLocalTypeName();
data.minimum_scale = reader.GetMinimumScale();
data.maximum_scale = reader.GetMaximumScale();
data.sql_data_type =
data.sql_data_type = util::GetNonConciseDataType(
EnsureRightSqlCharType(static_cast<SqlDataType>(reader.GetSqlDataType()),
metadata_settings_.use_wide_char);
metadata_settings_.use_wide_char));
data.sql_datetime_sub =
util::GetSqlDateTimeSubCode(static_cast<SqlDataType>(data.data_type));
data.num_prec_radix = reader.GetNumPrecRadix();
Expand Down
8 changes: 8 additions & 0 deletions cpp/src/arrow/flight/sql/odbc/odbc_impl/util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ SqlDataType GetDefaultSqlCharType(bool use_wide_char) {
SqlDataType GetDefaultSqlVarcharType(bool use_wide_char) {
return use_wide_char ? SqlDataType_WVARCHAR : SqlDataType_VARCHAR;
}
SqlDataType GetDefaultSqlLongVarcharType(bool use_wide_char) {
return use_wide_char ? SqlDataType_WLONGVARCHAR : SqlDataType_LONGVARCHAR;
}
CDataType GetDefaultCCharType(bool use_wide_char) {
return use_wide_char ? CDataType_WCHAR : CDataType_CHAR;
}
Expand Down Expand Up @@ -146,6 +149,9 @@ SqlDataType EnsureRightSqlCharType(SqlDataType data_type, bool use_wide_char) {
case SqlDataType_VARCHAR:
case SqlDataType_WVARCHAR:
return GetDefaultSqlVarcharType(use_wide_char);
case SqlDataType_LONGVARCHAR:
case SqlDataType_WLONGVARCHAR:
return GetDefaultSqlLongVarcharType(use_wide_char);
default:
return data_type;
}
Expand Down Expand Up @@ -747,10 +753,12 @@ bool NeedArrayConversion(Type::type original_type_id, CDataType data_type) {
return data_type != CDataType_BINARY;
case Type::DECIMAL128:
return data_type != CDataType_NUMERIC;
case Type::DURATION:
case Type::LIST:
case Type::LARGE_LIST:
case Type::FIXED_SIZE_LIST:
case Type::MAP:
case Type::STRING_VIEW:
case Type::STRUCT:
return data_type == CDataType_CHAR || data_type == CDataType_WCHAR;
default:
Expand Down
1 change: 1 addition & 0 deletions cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@ add_arrow_test(flight_sql_odbc_test
odbc_test_suite.cc
odbc_test_suite.h
connection_test.cc
type_info_test.cc
# Enable Protobuf cleanup after test execution
# GH-46889: move protobuf_test_util to a more common location
../../../../engine/substrait/protobuf_test_util.cc
Expand Down
Loading
Loading