feat(bigquery): support multistatement transaction statistics in jobs (#4485)
* feat(bigquery): support multistatement transaction statistics in jobs
diff --git a/bigquery/integration_test.go b/bigquery/integration_test.go
index 25ba131..09f72d6 100644
--- a/bigquery/integration_test.go
+++ b/bigquery/integration_test.go
@@ -2435,6 +2435,7 @@
sql := `
-- Declare a variable to hold names as an array.
DECLARE top_names ARRAY<STRING>;
+ BEGIN TRANSACTION;
-- Build an array of the top 100 names from the year 2017.
SET top_names = (
SELECT ARRAY_AGG(name ORDER BY number DESC LIMIT 100)
@@ -2449,6 +2450,7 @@
SELECT word
FROM ` + "`bigquery-public-data`" + `.samples.shakespeare
);
+ COMMIT TRANSACTION;
`
q := client.Query(sql)
job, err := q.Run(ctx)
@@ -2506,6 +2508,12 @@
if cStatus.Statistics.ScriptStatistics.EvaluationKind == "" {
t.Errorf("child job %q didn't indicate evaluation kind", cj.ID())
}
+ if cStatus.Statistics.TransactionInfo == nil {
+ t.Errorf("child job %q didn't have transaction info present", cj.ID())
+ }
+ if cStatus.Statistics.TransactionInfo.TransactionID == "" {
+ t.Errorf("child job %q didn't have transactionID present", cj.ID())
+ }
}
}
diff --git a/bigquery/job.go b/bigquery/job.go
index 0499da7..657d338 100644
--- a/bigquery/job.go
+++ b/bigquery/job.go
@@ -372,6 +372,9 @@
// ReservationUsage attributes slot consumption to reservations.
ReservationUsage []*ReservationUsage
+
+ // TransactionInfo indicates the transaction ID associated with the job, if any.
+ TransactionInfo *TransactionInfo
}
// Statistics is one of ExtractStatistics, LoadStatistics or QueryStatistics.
@@ -880,6 +883,7 @@
ParentJobID: s.ParentJobId,
ScriptStatistics: bqToScriptStatistics(s.ScriptStatistics),
ReservationUsage: bqToReservationUsage(s.ReservationUsage),
+ TransactionInfo: bqToTransactionInfo(s.TransactionInfo),
}
switch {
case s.Extract != nil:
@@ -983,3 +987,18 @@
}
return res
}
+
+// TransactionInfo contains information about a multi-statement transaction that may have associated with a job.
+type TransactionInfo struct {
+ // TransactionID is the system-generated identifier for the transaction.
+ TransactionID string
+}
+
+func bqToTransactionInfo(in *bq.TransactionInfo) *TransactionInfo {
+ if in == nil {
+ return nil
+ }
+ return &TransactionInfo{
+ TransactionID: in.TransactionId,
+ }
+}