This is an automated email from the ASF dual-hosted git repository.
lidavidm 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 0cb90c143 fix(go/adbc/driver/snowflake): fix GetObjects for VECTOR
cols (#2564)
0cb90c143 is described below
commit 0cb90c14378124e5d096d532d3ed04db237dce03
Author: Matt Topol <[email protected]>
AuthorDate: Wed Feb 26 18:51:13 2025 -0500
fix(go/adbc/driver/snowflake): fix GetObjects for VECTOR cols (#2564)
Fixes #2544 by eliminating the null pointer dereference for unknown
column types
---
go/adbc/driver/internal/shared_utils.go | 4 ++
go/adbc/driver/snowflake/connection.go | 9 ++++-
go/adbc/driver/snowflake/driver_test.go | 67 +++++++++++++++++++++++++++++++++
3 files changed, 79 insertions(+), 1 deletion(-)
diff --git a/go/adbc/driver/internal/shared_utils.go
b/go/adbc/driver/internal/shared_utils.go
index f8c51c636..4fec44a44 100644
--- a/go/adbc/driver/internal/shared_utils.go
+++ b/go/adbc/driver/internal/shared_utils.go
@@ -694,6 +694,10 @@ const (
)
func ToXdbcDataType(dt arrow.DataType) (xdbcType XdbcDataType) {
+ if dt == nil {
+ return XdbcDataType_XDBC_UNKNOWN_TYPE
+ }
+
switch dt.ID() {
case arrow.EXTENSION:
return ToXdbcDataType(dt.(arrow.ExtensionType).StorageType())
diff --git a/go/adbc/driver/snowflake/connection.go
b/go/adbc/driver/snowflake/connection.go
index c8dcae424..170c501c2 100644
--- a/go/adbc/driver/snowflake/connection.go
+++ b/go/adbc/driver/snowflake/connection.go
@@ -350,7 +350,9 @@ func (c *connectionImpl) GetObjects(ctx context.Context,
depth adbc.ObjectDepth,
field := c.toArrowField(col)
xdbcDataType :=
internal.ToXdbcDataType(field.Type)
-
getObjectsCatalog.CatalogDbSchemas[i].DbSchemaTables[j].TableColumns[k].XdbcDataType
= driverbase.Nullable(int16(field.Type.ID()))
+ if field.Type != nil {
+
getObjectsCatalog.CatalogDbSchemas[i].DbSchemaTables[j].TableColumns[k].XdbcDataType
= driverbase.Nullable(int16(field.Type.ID()))
+ }
getObjectsCatalog.CatalogDbSchemas[i].DbSchemaTables[j].TableColumns[k].XdbcSqlDataType
= driverbase.Nullable(int16(xdbcDataType))
}
}
@@ -475,6 +477,11 @@ func (c *connectionImpl) toArrowField(columnInfo
driverbase.ColumnInfo) arrow.Fi
fallthrough
case "GEOMETRY":
field.Type = arrow.BinaryTypes.String
+ case "VECTOR":
+ // despite the fact that Snowflake *does* support returning data
+ // for VECTOR typed columns as Arrow FixedSizeLists, there's no
way
+ // currently to retrieve enough metadata to construct the
proper type
+ // for it
}
return field
diff --git a/go/adbc/driver/snowflake/driver_test.go
b/go/adbc/driver/snowflake/driver_test.go
index 151292be9..9c8185b5b 100644
--- a/go/adbc/driver/snowflake/driver_test.go
+++ b/go/adbc/driver/snowflake/driver_test.go
@@ -2294,3 +2294,70 @@ ORDER BY start_time;
suite.False(rdr.Next())
suite.Require().NoError(rdr.Err())
}
+
+func (suite *SnowflakeTests) TestGetObjectsVector() {
+ suite.Require().NoError(suite.Quirks.DropTable(suite.cnxn,
"MYVECTORTABLE"))
+ suite.Require().NoError(suite.stmt.SetSqlQuery(`CREATE OR REPLACE TABLE
myvectortable (
+ a VECTOR(float, 3), b VECTOR(float, 3))`))
+ _, err := suite.stmt.ExecuteUpdate(suite.ctx)
+ suite.Require().NoError(err)
+ suite.Require().NoError(suite.stmt.SetSqlQuery(`INSERT INTO
myvectortable
+ SELECT [1.1,2.2,3]::VECTOR(FLOAT,3), [1,1,1]::VECTOR(FLOAT,3)`))
+ _, err = suite.stmt.ExecuteUpdate(suite.ctx)
+ suite.Require().NoError(err)
+
+ tableName := "MYVECTORTABLE"
+ rdr, err := suite.cnxn.GetObjects(suite.ctx, adbc.ObjectDepthColumns,
nil, nil, &tableName, nil, nil)
+ suite.Require().NoError(err)
+ defer rdr.Release()
+
+ suite.Require().True(rdr.Next())
+ rec := rdr.Record()
+
+ for i := 0; int64(i) < rec.NumRows(); i++ {
+ // list<db_schema_schema>
+ dbSchemasList := rec.Column(1).(*array.List)
+ // db_schema_schema (struct)
+ dbSchemas := dbSchemasList.ListValues().(*array.Struct)
+ // list<table_schema>
+ dbSchemaTablesList := dbSchemas.Field(1).(*array.List)
+ // table_schema (struct)
+ dbSchemaTables :=
dbSchemaTablesList.ListValues().(*array.Struct)
+ // list<column_schema>
+ tableColumnsList := dbSchemaTables.Field(2).(*array.List)
+ // column_schema (struct)
+ tableColumns := tableColumnsList.ListValues().(*array.Struct)
+
+ start, end := dbSchemasList.ValueOffsets(i)
+ for j := start; j < end; j++ {
+ schemaName :=
dbSchemas.Field(0).(*array.String).Value(int(j))
+ if !strings.EqualFold(schemaName,
suite.Quirks.DBSchema()) {
+ continue
+ }
+ tblStart, tblEnd :=
dbSchemaTablesList.ValueOffsets(int(j))
+ for k := tblStart; k < tblEnd; k++ {
+ tblName :=
dbSchemaTables.Field(0).(*array.String).Value(int(k))
+ if !strings.EqualFold(tblName, tableName) {
+ continue
+ }
+
+ colStart, colEnd :=
tableColumnsList.ValueOffsets(int(k))
+ suite.EqualValues(2, colEnd-colStart)
+
+ for l := colStart; l < colEnd; l++ {
+ colName :=
tableColumns.Field(0).(*array.String).Value(int(l))
+ ordinalPos :=
tableColumns.Field(1).(*array.Int32).Value(int(l))
+ typeName :=
tableColumns.Field(4).(*array.String).Value(int(l))
+ switch ordinalPos {
+ case 1:
+ suite.Equal("A", colName)
+ case 2:
+ suite.Equal("B", colName)
+ }
+
+ suite.Equal("VECTOR", typeName)
+ }
+ }
+ }
+ }
+}