Skip to content

bigquery: inconsistency in handling of repeated nested values and repeated values in valueMap #4950

@jameshartig

Description

@jameshartig

Client

bigquery

Environment

N/A

Go Environment

$ go version
go version go1.17 windows/amd64
$ go env

set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\james\AppData\Local\go-build
set GOENV=C:\Users\james\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\james\go\pkg\mod
set GONOPROXY=gerrit.levenlabs.com,gitlab.com/levenlabs
set GONOSUMDB=gerrit.levenlabs.com,gitlab.com/levenlabs
set GOOS=windows
set GOPATH=C:\Users\james\go;
set GOPRIVATE=gerrit.levenlabs.com,gitlab.com/levenlabs
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=C:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.17
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\Users\james\Dropbox\aftermath\backend\change-recorder\go.mod
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\james\AppData\Local\Temp\go-build2223974634=/tmp/go-build -gno-record-gcc-switches

Code

e.g.

package main

import (
	"context"
	"errors"
	"fmt"
	"reflect"

	"cloud.google.com/go/bigquery"
	"google.golang.org/api/iterator"
)

func main() {
	c, err := bigquery.NewClient(context.Background(), "project")
	if err != nil {
		panic(err)
	}

	iter, err := c.Query("SELECT ARRAY<string>[] as a, ARRAY<STRUCT<name string>>[] as b").Read(context.Background())
	if err != nil {
		panic(err)
	}
	for {
		vals := map[string]bigquery.Value{}
		if err := iter.Next(&vals); err != nil {
			if errors.Is(err, iterator.Done) {
				break
			}
		}
		fmt.Println(reflect.ValueOf(vals["a"]).IsNil())
		fmt.Println(reflect.ValueOf(vals["b"]).IsNil())
	}
}

Expected behavior

I expect the values to be nil in both cases of empty arrays.

Actual behavior

The repeated nested values are empty slices instead of nil.

Screenshots

N/A

Additional context

This can be fixed with:

--- a/bigquery/value.go
+++ b/bigquery/value.go
@@ -75,7 +75,11 @@ func loadMap(m map[string]Value, vals []Value, s Schema) {
                        v = m2
                default: // repeated and nested
                        sval := val.([]Value)
-                       vs := make([]Value, len(sval))
+
+                       var vs []Value
+                       if len(sval) > 0 {
+                               vs = make([]Value, len(sval))
+                       }
                        for j, e := range sval {
                                m2 := map[string]Value{}
                                loadMap(m2, e.([]Value), f.Schema)

Metadata

Metadata

Assignees

Labels

api: bigqueryIssues related to the BigQuery API.priority: p3Desirable enhancement or fix. May not be included in next release.type: questionRequest for information or clarification. Not an issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions