This is an automated email from the ASF dual-hosted git repository.
curth pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-adbc.git
The following commit(s) were added to refs/heads/main by this push:
new c3149c074 fix(csharp/src/Drivers/BigQuery): remove details to have
type names match ODBC (#2431)
c3149c074 is described below
commit c3149c0746d09877709e7625b7199e102d6d9c94
Author: davidhcoe <[email protected]>
AuthorDate: Sat Jan 11 23:20:26 2025 -0500
fix(csharp/src/Drivers/BigQuery): remove details to have type names match
ODBC (#2431)
- removes additional suffix details from data type names. For example,
STRUCT<...> is just a STRUCT type, and NUMERIC(n,y) is just NUMERIC to
match the ODBC type names.
- adds support for querying additional table types
---------
Co-authored-by: David Coe <>
---
csharp/src/Drivers/BigQuery/AssemblyInfo.cs | 20 +++++++++++
csharp/src/Drivers/BigQuery/BigQueryConnection.cs | 30 +++++++++++-----
csharp/src/Drivers/BigQuery/BigQueryTableTypes.cs | 25 +++++++++++++
.../Metadata/GetObjectsParser.cs | 7 +++-
csharp/test/Drivers/BigQuery/DriverTests.cs | 42 +++++++++++++++++++---
5 files changed, 110 insertions(+), 14 deletions(-)
diff --git a/csharp/src/Drivers/BigQuery/AssemblyInfo.cs
b/csharp/src/Drivers/BigQuery/AssemblyInfo.cs
new file mode 100644
index 000000000..f322fe8c6
--- /dev/null
+++ b/csharp/src/Drivers/BigQuery/AssemblyInfo.cs
@@ -0,0 +1,20 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+using System.Runtime.CompilerServices;
+
+[assembly: InternalsVisibleTo("Apache.Arrow.Adbc.Tests.Drivers.BigQuery,
PublicKey=0024000004800000940000000602000000240000525341310004000001000100e504183f6d470d6b67b6d19212be3e1f598f70c246a120194bc38130101d0c1853e4a0f2232cb12e37a7a90e707aabd38511dac4f25fcb0d691b2aa265900bf42de7f70468fc997551a40e1e0679b605aa2088a4a69e07c117e988f5b1738c570ee66997fba02485e7856a49eca5fd0706d09899b8312577cbb9034599fc92d4")]
diff --git a/csharp/src/Drivers/BigQuery/BigQueryConnection.cs
b/csharp/src/Drivers/BigQuery/BigQueryConnection.cs
index 398365314..1c29a4b50 100644
--- a/csharp/src/Drivers/BigQuery/BigQueryConnection.cs
+++ b/csharp/src/Drivers/BigQuery/BigQueryConnection.cs
@@ -47,7 +47,7 @@ namespace Apache.Arrow.Adbc.Drivers.BigQuery
const string infoVendorName = "BigQuery";
const string infoDriverArrowVersion = "1.0.0";
- readonly AdbcInfoCode[] infoSupportedCodes = new [] {
+ readonly AdbcInfoCode[] infoSupportedCodes = new[] {
AdbcInfoCode.DriverName,
AdbcInfoCode.DriverVersion,
AdbcInfoCode.DriverArrowVersion,
@@ -447,7 +447,7 @@ namespace Apache.Arrow.Adbc.Drivers.BigQuery
nullBitmapBuffer.Append(true);
length++;
- if (includeConstraints)
+ if (depth == GetObjectsDepth.All && includeConstraints)
{
tableConstraintsValues.Add(GetConstraintSchema(
depth, catalog, dbSchema,
GetValue(row["table_name"]), columnNamePattern));
@@ -530,11 +530,15 @@ namespace Apache.Arrow.Adbc.Drivers.BigQuery
ordinalPositionBuilder.Append((int)(long)row["ordinal_position"]);
remarksBuilder.Append("");
- string dataType = ToTypeName(GetValue(row["data_type"]));
+ string dataType = ToTypeName(GetValue(row["data_type"]),
out string suffix);
- if (dataType.StartsWith("NUMERIC") ||
dataType.StartsWith("DECIMAL") || dataType.StartsWith("BIGNUMERIC") ||
dataType.StartsWith("BIGDECIMAL"))
+ if ((dataType.StartsWith("NUMERIC") ||
+ dataType.StartsWith("DECIMAL") ||
+ dataType.StartsWith("BIGNUMERIC") ||
+ dataType.StartsWith("BIGDECIMAL"))
+ && !string.IsNullOrEmpty(suffix))
{
- ParsedDecimalValues values =
ParsePrecisionAndScale(dataType);
+ ParsedDecimalValues values =
ParsePrecisionAndScale(suffix);
xdbcColumnSizeBuilder.Append(values.Precision);
xdbcDecimalDigitsBuilder.Append(Convert.ToInt16(values.Scale));
}
@@ -652,6 +656,7 @@ namespace Apache.Arrow.Adbc.Drivers.BigQuery
constraintColumnNamesValues.BuildListArrayForType(StringType.Default),
constraintColumnUsageValues.BuildListArrayForType(new
StructType(StandardSchemas.UsageSchema))
};
+
StandardSchemas.ConstraintSchema.Validate(dataArrays);
return new StructArray(
@@ -752,10 +757,19 @@ namespace Apache.Arrow.Adbc.Drivers.BigQuery
return builder.ToString();
}
- private string ToTypeName(string type)
+ private string ToTypeName(string type, out string suffix)
{
- int index = Math.Min(type.IndexOf("("), type.IndexOf("<"));
+ suffix = string.Empty;
+
+ int index = type.IndexOf("(");
+ if (index == -1)
+ index = type.IndexOf("<");
+
string dataType = index == -1 ? type : type.Substring(0, index);
+
+ if (index > -1)
+ suffix = type.Substring(dataType.Length);
+
return dataType;
}
@@ -965,7 +979,7 @@ namespace Apache.Arrow.Adbc.Drivers.BigQuery
public override IArrowArrayStream GetTableTypes()
{
StringArray.Builder tableTypesBuilder = new StringArray.Builder();
- tableTypesBuilder.AppendRange(new string[] { "BASE TABLE", "VIEW"
});
+ tableTypesBuilder.AppendRange(BigQueryTableTypes.TableTypes);
IArrowArray[] dataArrays = new IArrowArray[]
{
diff --git a/csharp/src/Drivers/BigQuery/BigQueryTableTypes.cs
b/csharp/src/Drivers/BigQuery/BigQueryTableTypes.cs
new file mode 100644
index 000000000..e2d47fc7a
--- /dev/null
+++ b/csharp/src/Drivers/BigQuery/BigQueryTableTypes.cs
@@ -0,0 +1,25 @@
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+using System.Collections.Generic;
+
+namespace Apache.Arrow.Adbc.Drivers.BigQuery
+{
+ internal static class BigQueryTableTypes
+ {
+ public static readonly string[] TableTypes = new string[]{ "BASE
TABLE", "VIEW", "CLONE", "SNAPSHOT" };
+ }
+}
diff --git a/csharp/test/Apache.Arrow.Adbc.Tests/Metadata/GetObjectsParser.cs
b/csharp/test/Apache.Arrow.Adbc.Tests/Metadata/GetObjectsParser.cs
index 6b10f4cde..8d5dc25b6 100644
--- a/csharp/test/Apache.Arrow.Adbc.Tests/Metadata/GetObjectsParser.cs
+++ b/csharp/test/Apache.Arrow.Adbc.Tests/Metadata/GetObjectsParser.cs
@@ -156,9 +156,14 @@ namespace Apache.Arrow.Adbc.Tests.Metadata
{
if (constraintsArray == null) return null;
+ // constraint details may not be loaded correctly if the depth
wasn't Columns
+ int fieldCount = constraintsArray?.Fields?.Count ?? 0;
+ if (fieldCount == 0)
+ return null;
+
List<AdbcConstraint> constraints = new List<AdbcConstraint>();
- StringArray name =
(StringArray)constraintsArray.Fields[StandardSchemas.ConstraintSchema.FindIndexOrThrow("constraint_name")];
// constraint_name | utf8
+ StringArray name =
(StringArray)constraintsArray!.Fields[StandardSchemas.ConstraintSchema.FindIndexOrThrow("constraint_name")];
// constraint_name | utf8
StringArray type =
(StringArray)constraintsArray.Fields[StandardSchemas.ConstraintSchema.FindIndexOrThrow("constraint_type")];
// constraint_type | utf8 not null
ListArray columnNames =
(ListArray)constraintsArray.Fields[StandardSchemas.ConstraintSchema.FindIndexOrThrow("constraint_column_names")];
// constraint_column_names | list<utf8> not null
ListArray columnUsages =
(ListArray)constraintsArray.Fields[StandardSchemas.ConstraintSchema.FindIndexOrThrow("constraint_column_usage")];
// constraint_column_usage | list<USAGE_SCHEMA>
diff --git a/csharp/test/Drivers/BigQuery/DriverTests.cs
b/csharp/test/Drivers/BigQuery/DriverTests.cs
index 9c587c1eb..579a2a83c 100644
--- a/csharp/test/Drivers/BigQuery/DriverTests.cs
+++ b/csharp/test/Drivers/BigQuery/DriverTests.cs
@@ -18,6 +18,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
+using Apache.Arrow.Adbc.Drivers.BigQuery;
using Apache.Arrow.Adbc.Tests.Metadata;
using Apache.Arrow.Adbc.Tests.Xunit;
using Apache.Arrow.Ipc;
@@ -116,7 +117,7 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.BigQuery
catalogPattern: catalogName,
dbSchemaPattern: schemaName,
tableNamePattern: tableName,
- tableTypes: new List<string> { "BASE TABLE", "VIEW" },
+ tableTypes: BigQueryTableTypes.TableTypes,
columnNamePattern: columnName);
RecordBatch recordBatch = stream.ReadNextRecordBatchAsync().Result;
@@ -134,6 +135,40 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.BigQuery
Assert.Equal(_testConfiguration.Metadata.ExpectedColumnCount,
columns?.Count);
}
+ [SkippableFact, Order(3)]
+ public void CanGetObjectsTables()
+ {
+ string? catalogName = _testConfiguration.Metadata.Catalog;
+ string? schemaName = _testConfiguration.Metadata.Schema;
+ string? tableName = _testConfiguration.Metadata.Table;
+
+ AdbcConnection adbcConnection =
BigQueryTestingUtils.GetBigQueryAdbcConnection(_testConfiguration);
+
+ IArrowArrayStream stream = adbcConnection.GetObjects(
+ depth: AdbcConnection.GetObjectsDepth.Tables,
+ catalogPattern: catalogName,
+ dbSchemaPattern: schemaName,
+ tableNamePattern: null,
+ tableTypes: BigQueryTableTypes.TableTypes,
+ columnNamePattern: null);
+
+ RecordBatch recordBatch = stream.ReadNextRecordBatchAsync().Result;
+
+ List<AdbcCatalog> catalogs =
GetObjectsParser.ParseCatalog(recordBatch, schemaName);
+
+ List<AdbcTable>? tables = catalogs
+ .Where(c => string.Equals(c.Name, catalogName))
+ .Select(c => c.DbSchemas)
+ .FirstOrDefault()
+ ?.Where(s => string.Equals(s.Name, schemaName))
+ .Select(s => s.Tables)
+ .FirstOrDefault();
+
+ AdbcTable? table = tables?.Where((table) =>
string.Equals(table.Name, tableName)).FirstOrDefault();
+ Assert.True(table != null, "table should not be null");
+ Assert.Equal("BASE TABLE", table.Type);
+ }
+
/// <summary>
/// Validates if the driver can call GetTableSchema.
/// </summary>
@@ -167,10 +202,7 @@ namespace Apache.Arrow.Adbc.Tests.Drivers.BigQuery
StringArray stringArray =
(StringArray)recordBatch.Column("table_type");
- List<string> known_types = new List<string>
- {
- "BASE TABLE", "VIEW"
- };
+ List<string> known_types = BigQueryTableTypes.TableTypes.ToList();
int results = 0;