Skip to content

Commit 6bbe6fe

Browse files
committed
Extract SQLGetTypeInfo implementation
Add TODO for removing boost Address Justin's comment Remove unneeded addition of `arrow::` to be consistent with rest of `odbc` code base Co-Authored-By: alinalibq <[email protected]>
1 parent 082377a commit 6bbe6fe

File tree

5 files changed

+1741
-5
lines changed

5 files changed

+1741
-5
lines changed

cpp/src/arrow/flight/sql/odbc/odbc_api.cc

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1224,8 +1224,60 @@ SQLRETURN SQLGetTypeInfo(SQLHSTMT stmt, SQLSMALLINT data_type) {
12241224
// appropriate data types in `SEARCHABLE` field
12251225
ARROW_LOG(DEBUG) << "SQLGetTypeInfoW called with stmt: " << stmt
12261226
<< " data_type: " << data_type;
1227-
// GH-47722 TODO: Implement SQLGetTypeInfo
1228-
return SQL_INVALID_HANDLE;
1227+
1228+
using ODBC::ODBCStatement;
1229+
return ODBC::ODBCStatement::ExecuteWithDiagnostics(stmt, SQL_ERROR, [=]() {
1230+
ODBCStatement* statement = reinterpret_cast<ODBCStatement*>(stmt);
1231+
1232+
switch (data_type) {
1233+
case SQL_ALL_TYPES:
1234+
case SQL_CHAR:
1235+
case SQL_VARCHAR:
1236+
case SQL_LONGVARCHAR:
1237+
case SQL_WCHAR:
1238+
case SQL_WVARCHAR:
1239+
case SQL_WLONGVARCHAR:
1240+
case SQL_BIT:
1241+
case SQL_BINARY:
1242+
case SQL_VARBINARY:
1243+
case SQL_LONGVARBINARY:
1244+
case SQL_TINYINT:
1245+
case SQL_SMALLINT:
1246+
case SQL_INTEGER:
1247+
case SQL_BIGINT:
1248+
case SQL_NUMERIC:
1249+
case SQL_DECIMAL:
1250+
case SQL_FLOAT:
1251+
case SQL_REAL:
1252+
case SQL_DOUBLE:
1253+
case SQL_GUID:
1254+
case SQL_DATE:
1255+
case SQL_TYPE_DATE:
1256+
case SQL_TIME:
1257+
case SQL_TYPE_TIME:
1258+
case SQL_TIMESTAMP:
1259+
case SQL_TYPE_TIMESTAMP:
1260+
case SQL_INTERVAL_DAY:
1261+
case SQL_INTERVAL_DAY_TO_HOUR:
1262+
case SQL_INTERVAL_DAY_TO_MINUTE:
1263+
case SQL_INTERVAL_DAY_TO_SECOND:
1264+
case SQL_INTERVAL_HOUR:
1265+
case SQL_INTERVAL_HOUR_TO_MINUTE:
1266+
case SQL_INTERVAL_HOUR_TO_SECOND:
1267+
case SQL_INTERVAL_MINUTE:
1268+
case SQL_INTERVAL_MINUTE_TO_SECOND:
1269+
case SQL_INTERVAL_SECOND:
1270+
case SQL_INTERVAL_YEAR:
1271+
case SQL_INTERVAL_YEAR_TO_MONTH:
1272+
case SQL_INTERVAL_MONTH:
1273+
statement->GetTypeInfo(data_type);
1274+
break;
1275+
default:
1276+
throw DriverException("Invalid SQL data type", "HY004");
1277+
}
1278+
1279+
return SQL_SUCCESS;
1280+
});
12291281
}
12301282

12311283
SQLRETURN SQLNativeSql(SQLHDBC conn, SQLWCHAR* in_statement_text,

cpp/src/arrow/flight/sql/odbc/odbc_impl/flight_sql_statement_get_type_info.cc

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -108,24 +108,27 @@ Result<std::shared_ptr<RecordBatch>> TransformInner(
108108
data.literal_suffix = reader.GetLiteralSuffix();
109109

110110
const auto& create_params = reader.GetCreateParams();
111-
if (create_params) {
111+
if (create_params && !create_params->empty()) {
112+
// GH-48093 TODO: replace boost-algorithm with alternatives
112113
data.create_params = boost::algorithm::join(*create_params, ",");
113114
} else {
114115
data.create_params = nullopt;
115116
}
116117

117118
data.nullable = reader.GetNullable() ? NULLABILITY_NULLABLE : NULLABILITY_NO_NULLS;
118119
data.case_sensitive = reader.GetCaseSensitive();
120+
// GH-47237 return SEARCHABILITY_LIKE_ONLY and SEARCHABILITY_ALL_EXPECT_LIKE for
121+
// appropriate data types
119122
data.searchable = reader.GetSearchable() ? SEARCHABILITY_ALL : SEARCHABILITY_NONE;
120123
data.unsigned_attribute = reader.GetUnsignedAttribute();
121124
data.fixed_prec_scale = reader.GetFixedPrecScale();
122125
data.auto_unique_value = reader.GetAutoIncrement();
123126
data.local_type_name = reader.GetLocalTypeName();
124127
data.minimum_scale = reader.GetMinimumScale();
125128
data.maximum_scale = reader.GetMaximumScale();
126-
data.sql_data_type =
129+
data.sql_data_type = util::GetNonConciseDataType(
127130
EnsureRightSqlCharType(static_cast<SqlDataType>(reader.GetSqlDataType()),
128-
metadata_settings_.use_wide_char);
131+
metadata_settings_.use_wide_char));
129132
data.sql_datetime_sub =
130133
util::GetSqlDateTimeSubCode(static_cast<SqlDataType>(data.data_type));
131134
data.num_prec_radix = reader.GetNumPrecRadix();

cpp/src/arrow/flight/sql/odbc/odbc_impl/util.cc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,9 @@ SqlDataType GetDefaultSqlCharType(bool use_wide_char) {
5656
SqlDataType GetDefaultSqlVarcharType(bool use_wide_char) {
5757
return use_wide_char ? SqlDataType_WVARCHAR : SqlDataType_VARCHAR;
5858
}
59+
SqlDataType GetDefaultSqlLongVarcharType(bool use_wide_char) {
60+
return use_wide_char ? SqlDataType_WLONGVARCHAR : SqlDataType_LONGVARCHAR;
61+
}
5962
CDataType GetDefaultCCharType(bool use_wide_char) {
6063
return use_wide_char ? CDataType_WCHAR : CDataType_CHAR;
6164
}
@@ -147,6 +150,9 @@ SqlDataType EnsureRightSqlCharType(SqlDataType data_type, bool use_wide_char) {
147150
case SqlDataType_VARCHAR:
148151
case SqlDataType_WVARCHAR:
149152
return GetDefaultSqlVarcharType(use_wide_char);
153+
case SqlDataType_LONGVARCHAR:
154+
case SqlDataType_WLONGVARCHAR:
155+
return GetDefaultSqlLongVarcharType(use_wide_char);
150156
default:
151157
return data_type;
152158
}
@@ -748,10 +754,12 @@ bool NeedArrayConversion(Type::type original_type_id, CDataType data_type) {
748754
return data_type != CDataType_BINARY;
749755
case Type::DECIMAL128:
750756
return data_type != CDataType_NUMERIC;
757+
case Type::DURATION:
751758
case Type::LIST:
752759
case Type::LARGE_LIST:
753760
case Type::FIXED_SIZE_LIST:
754761
case Type::MAP:
762+
case Type::STRING_VIEW:
755763
case Type::STRUCT:
756764
return data_type == CDataType_CHAR || data_type == CDataType_WCHAR;
757765
default:

cpp/src/arrow/flight/sql/odbc/tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ add_arrow_test(flight_sql_odbc_test
3838
connection_test.cc
3939
statement_attr_test.cc
4040
statement_test.cc
41+
type_info_test.cc
4142
# Enable Protobuf cleanup after test execution
4243
# GH-46889: move protobuf_test_util to a more common location
4344
../../../../engine/substrait/protobuf_test_util.cc

0 commit comments

Comments
 (0)