@@ -276,7 +276,9 @@ void ODBCDescriptor::GetHeaderField(SQLSMALLINT field_identifier, SQLPOINTER val
276276 GetAttribute (rows_processed_ptr_, value, buffer_length, output_length);
277277 break ;
278278 case SQL_DESC_COUNT: {
279- GetAttribute (highest_one_based_bound_record_, value, buffer_length, output_length);
279+ // highest_one_based_bound_record_ equals number of records + 1
280+ GetAttribute (static_cast <SQLSMALLINT>(highest_one_based_bound_record_ - 1 ), value,
281+ buffer_length, output_length);
280282 break ;
281283 }
282284 default :
@@ -310,54 +312,55 @@ void ODBCDescriptor::GetField(SQLSMALLINT record_number, SQLSMALLINT field_ident
310312 throw DriverException (" Invalid descriptor index" , " 07009" );
311313 }
312314
313- // TODO: Restrict fields based on AppDescriptor IPD, and IRD.
315+ // GH-47867 TODO: Restrict fields based on AppDescriptor IPD, and IRD.
314316
317+ bool length_in_bytes = true ;
315318 SQLSMALLINT zero_based_record = record_number - 1 ;
316319 const DescriptorRecord& record = records_[zero_based_record];
317320 switch (field_identifier) {
318321 case SQL_DESC_BASE_COLUMN_NAME:
319- GetAttributeUTF8 (record.base_column_name , value, buffer_length, output_length ,
320- GetDiagnostics ());
322+ GetAttributeSQLWCHAR (record.base_column_name , length_in_bytes, value, buffer_length ,
323+ output_length, GetDiagnostics ());
321324 break ;
322325 case SQL_DESC_BASE_TABLE_NAME:
323- GetAttributeUTF8 (record.base_table_name , value, buffer_length, output_length ,
324- GetDiagnostics ());
326+ GetAttributeSQLWCHAR (record.base_table_name , length_in_bytes, value, buffer_length ,
327+ output_length, GetDiagnostics ());
325328 break ;
326329 case SQL_DESC_CATALOG_NAME:
327- GetAttributeUTF8 (record.catalog_name , value, buffer_length, output_length ,
328- GetDiagnostics ());
330+ GetAttributeSQLWCHAR (record.catalog_name , length_in_bytes, value, buffer_length ,
331+ output_length, GetDiagnostics ());
329332 break ;
330333 case SQL_DESC_LABEL:
331- GetAttributeUTF8 (record.label , value, buffer_length, output_length ,
332- GetDiagnostics ());
334+ GetAttributeSQLWCHAR (record.label , length_in_bytes, value, buffer_length ,
335+ output_length, GetDiagnostics ());
333336 break ;
334337 case SQL_DESC_LITERAL_PREFIX:
335- GetAttributeUTF8 (record.literal_prefix , value, buffer_length, output_length ,
336- GetDiagnostics ());
338+ GetAttributeSQLWCHAR (record.literal_prefix , length_in_bytes, value, buffer_length ,
339+ output_length, GetDiagnostics ());
337340 break ;
338341 case SQL_DESC_LITERAL_SUFFIX:
339- GetAttributeUTF8 (record.literal_suffix , value, buffer_length, output_length ,
340- GetDiagnostics ());
342+ GetAttributeSQLWCHAR (record.literal_suffix , length_in_bytes, value, buffer_length ,
343+ output_length, GetDiagnostics ());
341344 break ;
342345 case SQL_DESC_LOCAL_TYPE_NAME:
343- GetAttributeUTF8 (record.local_type_name , value, buffer_length, output_length ,
344- GetDiagnostics ());
346+ GetAttributeSQLWCHAR (record.local_type_name , length_in_bytes, value, buffer_length ,
347+ output_length, GetDiagnostics ());
345348 break ;
346349 case SQL_DESC_NAME:
347- GetAttributeUTF8 (record.name , value, buffer_length, output_length ,
348- GetDiagnostics ());
350+ GetAttributeSQLWCHAR (record.name , length_in_bytes, value, buffer_length ,
351+ output_length, GetDiagnostics ());
349352 break ;
350353 case SQL_DESC_SCHEMA_NAME:
351- GetAttributeUTF8 (record.schema_name , value, buffer_length, output_length ,
352- GetDiagnostics ());
354+ GetAttributeSQLWCHAR (record.schema_name , length_in_bytes, value, buffer_length ,
355+ output_length, GetDiagnostics ());
353356 break ;
354357 case SQL_DESC_TABLE_NAME:
355- GetAttributeUTF8 (record.table_name , value, buffer_length, output_length ,
356- GetDiagnostics ());
358+ GetAttributeSQLWCHAR (record.table_name , length_in_bytes, value, buffer_length ,
359+ output_length, GetDiagnostics ());
357360 break ;
358361 case SQL_DESC_TYPE_NAME:
359- GetAttributeUTF8 (record.type_name , value, buffer_length, output_length ,
360- GetDiagnostics ());
362+ GetAttributeSQLWCHAR (record.type_name , length_in_bytes, value, buffer_length ,
363+ output_length, GetDiagnostics ());
361364 break ;
362365
363366 case SQL_DESC_DATA_PTR:
@@ -367,7 +370,7 @@ void ODBCDescriptor::GetField(SQLSMALLINT record_number, SQLSMALLINT field_ident
367370 case SQL_DESC_OCTET_LENGTH_PTR:
368371 GetAttribute (record.indicator_ptr , value, buffer_length, output_length);
369372 break ;
370-
373+ case SQL_COLUMN_LENGTH: // ODBC 2.0
371374 case SQL_DESC_LENGTH:
372375 GetAttribute (record.length , value, buffer_length, output_length);
373376 break ;
@@ -407,12 +410,14 @@ void ODBCDescriptor::GetField(SQLSMALLINT record_number, SQLSMALLINT field_ident
407410 case SQL_DESC_PARAMETER_TYPE:
408411 GetAttribute (record.param_type , value, buffer_length, output_length);
409412 break ;
413+ case SQL_COLUMN_PRECISION: // ODBC 2.0
410414 case SQL_DESC_PRECISION:
411415 GetAttribute (record.precision , value, buffer_length, output_length);
412416 break ;
413417 case SQL_DESC_ROWVER:
414418 GetAttribute (record.row_ver , value, buffer_length, output_length);
415419 break ;
420+ case SQL_COLUMN_SCALE: // ODBC 2.0
416421 case SQL_DESC_SCALE:
417422 GetAttribute (record.scale , value, buffer_length, output_length);
418423 break ;
@@ -479,6 +484,8 @@ void ODBCDescriptor::PopulateFromResultSetMetadata(ResultSetMetadata* rsmd) {
479484
480485 for (size_t i = 0 ; i < records_.size (); ++i) {
481486 size_t one_based_index = i + 1 ;
487+ int16_t concise_type = rsmd->GetConciseType (one_based_index);
488+
482489 records_[i].base_column_name = rsmd->GetBaseColumnName (one_based_index);
483490 records_[i].base_table_name = rsmd->GetBaseTableName (one_based_index);
484491 records_[i].catalog_name = rsmd->GetCatalogName (one_based_index);
@@ -489,9 +496,8 @@ void ODBCDescriptor::PopulateFromResultSetMetadata(ResultSetMetadata* rsmd) {
489496 records_[i].name = rsmd->GetName (one_based_index);
490497 records_[i].schema_name = rsmd->GetSchemaName (one_based_index);
491498 records_[i].table_name = rsmd->GetTableName (one_based_index);
492- records_[i].type_name = rsmd->GetTypeName (one_based_index);
493- records_[i].concise_type = GetSqlTypeForODBCVersion (
494- rsmd->GetConciseType (one_based_index), is_2x_connection_);
499+ records_[i].type_name = rsmd->GetTypeName (one_based_index, concise_type);
500+ records_[i].concise_type = GetSqlTypeForODBCVersion (concise_type, is_2x_connection_);
495501 records_[i].data_ptr = nullptr ;
496502 records_[i].indicator_ptr = nullptr ;
497503 records_[i].display_size = rsmd->GetColumnDisplaySize (one_based_index);
0 commit comments