Skip to content

Commit d147c00

Browse files
authored
Merge pull request #35 from simi/v0.4.4-recidiviz.25-ds
fix: populate destinationTable for queries without explicit destination
2 parents fb07a52 + 596c550 commit d147c00

File tree

2 files changed

+121
-1
lines changed

2 files changed

+121
-1
lines changed

server/handler.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1680,7 +1680,7 @@ func deleteTableMetadata(ctx context.Context, server *Server, spec *zetasqlite.T
16801680
func (h *jobsInsertHandler) addQueryResultToDynamicDestinationTable(ctx context.Context, tx *connection.Tx, r *jobsInsertRequest, response *internaltypes.QueryResponse) error {
16811681
projectID := r.project.ID
16821682
jobID := r.job.JobReference.JobId
1683-
datasetID := jobID
1683+
datasetID := "ds_" + jobID
16841684
tableID := jobID
16851685

16861686
tableDef, err := h.tableDefFromQueryResponse(tableID, response)
@@ -1713,6 +1713,11 @@ func (h *jobsInsertHandler) addQueryResultToDynamicDestinationTable(ctx context.
17131713
if err := r.server.contentRepo.AddTableData(ctx, tx, projectID, datasetID, tableDef, false); err != nil {
17141714
return fmt.Errorf("failed to add table data: %w", err)
17151715
}
1716+
r.job.Configuration.Query.DestinationTable = &bigqueryv2.TableReference{
1717+
DatasetId: datasetID,
1718+
ProjectId: projectID,
1719+
TableId: tableID,
1720+
}
17161721
return nil
17171722
}
17181723

server/server_test.go

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2977,6 +2977,121 @@ func TestRowAccessPolicy(t *testing.T) {
29772977
}
29782978
}
29792979

2980+
func TestQueryWithoutDestinationTable(t *testing.T) {
2981+
ctx := context.Background()
2982+
2983+
const (
2984+
projectName = "test"
2985+
)
2986+
2987+
bqServer, err := server.New(server.TempStorage)
2988+
if err != nil {
2989+
t.Fatal(err)
2990+
}
2991+
if err := bqServer.SetProject(projectName); err != nil {
2992+
t.Fatal(err)
2993+
}
2994+
if err := bqServer.Load(server.YAMLSource(filepath.Join("testdata", "data.yaml"))); err != nil {
2995+
t.Fatal(err)
2996+
}
2997+
2998+
testServer := bqServer.TestServer()
2999+
defer func() {
3000+
testServer.Close()
3001+
bqServer.Stop(ctx)
3002+
}()
3003+
3004+
client, err := bigquery.NewClient(
3005+
ctx,
3006+
projectName,
3007+
option.WithEndpoint(testServer.URL),
3008+
option.WithoutAuthentication(),
3009+
)
3010+
if err != nil {
3011+
t.Fatal(err)
3012+
}
3013+
defer client.Close()
3014+
3015+
query := client.Query("SELECT id, name FROM dataset1.table_a WHERE id = 1")
3016+
job, err := query.Run(ctx)
3017+
if err != nil {
3018+
t.Fatal(err)
3019+
}
3020+
if _, err := job.Wait(ctx); err != nil {
3021+
t.Fatal(err)
3022+
}
3023+
3024+
config, err := job.Config()
3025+
if err != nil {
3026+
t.Fatal(err)
3027+
}
3028+
qConfig, ok := config.(*bigquery.QueryConfig)
3029+
if !ok {
3030+
t.Fatal("expected QueryConfig")
3031+
}
3032+
if qConfig.Dst == nil {
3033+
t.Fatal("expected destination table to be set")
3034+
}
3035+
if qConfig.Dst.ProjectID != projectName {
3036+
t.Fatalf("expected project ID %s, got %s", projectName, qConfig.Dst.ProjectID)
3037+
}
3038+
3039+
expectedDatasetID := "ds_" + job.ID()
3040+
if qConfig.Dst.DatasetID != expectedDatasetID {
3041+
t.Fatalf("expected dataset ID %s, got %s", expectedDatasetID, qConfig.Dst.DatasetID)
3042+
}
3043+
if qConfig.Dst.TableID != job.ID() {
3044+
t.Fatalf("expected table ID %s, got %s", job.ID(), qConfig.Dst.TableID)
3045+
}
3046+
3047+
dynamicTableQuery := client.Query(fmt.Sprintf("SELECT * FROM `%s.%s.%s`",
3048+
qConfig.Dst.ProjectID, qConfig.Dst.DatasetID, qConfig.Dst.TableID))
3049+
it, err := dynamicTableQuery.Read(ctx)
3050+
if err != nil {
3051+
t.Fatal(err)
3052+
}
3053+
var rowCount int
3054+
for {
3055+
var row []bigquery.Value
3056+
if err := it.Next(&row); err != nil {
3057+
if err == iterator.Done {
3058+
break
3059+
}
3060+
t.Fatal(err)
3061+
}
3062+
rowCount++
3063+
}
3064+
if rowCount != 1 {
3065+
t.Fatalf("expected 1 row in dynamic destination table, got %d", rowCount)
3066+
}
3067+
3068+
query2 := client.Query("SELECT id FROM dataset1.table_a WHERE id = 2")
3069+
job2, err := query2.Run(ctx)
3070+
if err != nil {
3071+
t.Fatal(err)
3072+
}
3073+
if _, err := job2.Wait(ctx); err != nil {
3074+
t.Fatal(err)
3075+
}
3076+
3077+
config2, err := job2.Config()
3078+
if err != nil {
3079+
t.Fatal(err)
3080+
}
3081+
qConfig2 := config2.(*bigquery.QueryConfig)
3082+
if qConfig2.Dst == nil {
3083+
t.Fatal("expected destination table to be set for second job")
3084+
}
3085+
if qConfig.Dst.DatasetID == qConfig2.Dst.DatasetID {
3086+
t.Fatalf("expected different dataset IDs, both got %s", qConfig.Dst.DatasetID)
3087+
}
3088+
3089+
expectedDatasetID2 := "ds_" + job2.ID()
3090+
if qConfig2.Dst.DatasetID != expectedDatasetID2 {
3091+
t.Fatalf("expected dataset ID %s, got %s", expectedDatasetID2, qConfig2.Dst.DatasetID)
3092+
}
3093+
}
3094+
29803095
func TestPatchTable(t *testing.T) {
29813096
ctx := context.Background()
29823097

0 commit comments

Comments
 (0)