fix: bigquery result column order (#1884)

Assigning job iterator value to an array instead of map to preserve
column order.

When assigning incoming values to map, sometimes the result is not in
order of statement. E.g. `SELECT id, name from ...` might turn into
`{"name": "name_value", "id":1}` rather than `{"id":1, "name":
"name_value"}`. Previously, during json marshaling, it will ALWAYS order
the map in alphabetical order. so that wasn't an issue.

With the implementation of `orderedmap` (#1852), the bigquery execute
sql tool will now preserves the column order during the marshaling
process. Due to this, bigquery's integration test is flaky and failed
when the map is reordered. This update assign incoming value as array
instead, preserving the actual order.
This commit is contained in:
Yuan Teoh
2025-11-06 14:02:25 -08:00
committed by GitHub
parent 30857c2294
commit 559e2a22e0

View File

@@ -325,7 +325,7 @@ func (t Tool) Invoke(ctx context.Context, params tools.ParamValues, accessToken
return nil, fmt.Errorf("unable to read query results: %w", err)
}
for {
var val map[string]bigqueryapi.Value
var val []bigqueryapi.Value
err = it.Next(&val)
if err == iterator.Done {
break
@@ -333,9 +333,10 @@ func (t Tool) Invoke(ctx context.Context, params tools.ParamValues, accessToken
if err != nil {
return nil, fmt.Errorf("unable to iterate through query results: %w", err)
}
schema := it.Schema
row := orderedmap.Row{}
for key, value := range val {
row.Add(key, value)
for i, field := range schema {
row.Add(field.Name, val[i])
}
out = append(out, row)
}