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;
 

Reply via email to