google-cloud-go: Bigquery sets expiration Table expiration time to today, even if date is in the future

Client

BigQuery

Describe Your Environment

gLinux

Expected Behavior

Sets Table expiration date to Dec 1st 9999

Actual Behavior

Sets Table expiration date to current timestamp, causing table to be deleted.

Example Code:

package main

import (
        "fmt"
        "time"
        "log"
        "context"
        "cloud.google.com/go/bigquery"
        "encoding/json"
)

func main() {
        ctx := context.Background()
        c, err := bigquery.NewClient(ctx, "snap-tests-217018")
        if err != nil {
                log.Fatal("failed to make client", err)
        }
        d := c.Dataset("testdataset")

        md, err := d.Metadata(ctx)
        if err != nil {
                log.Fatal("failed to get dataset metadata", err)
        }
        bmd, _ := json.MarshalIndent(md, "", "  ")
        log.Println("Datset Metadata", string(bmd))

        t := d.Table("testtable")
        mt, err := t.Metadata(ctx)
        if err != nil {
                log.Fatal("failed to get table metadata", err)
        }
        bmt, _ := json.MarshalIndent(mt, "", "  ")
        log.Println("Table Metadata", string(bmt))

        mt2, err := t.Update(ctx, bigquery.TableMetadataToUpdate{
                Description: fmt.Sprintf("My Table (timestamp - %d)", time.Now().Unix()),
                ExpirationTime: time.Date(3119, time.December, 10, 23, 0, 0, 0, time.UTC),

        }, "")
        if err != nil {
                log.Fatal("Failed to change table metadata", err)
        }
        bmt2, _ := json.MarshalIndent(mt2, "", "  ")
        log.Println("Changed Table Metadata", string(bmt2))
}

(Note output shows Expiration time is not 3119, but current date && no error was thrown)

About this issue

  • Original URL
  • State: closed
  • Created 6 years ago
  • Comments: 15 (5 by maintainers)

Most upvoted comments

UnixNano returns t as a Unix time, the number of nanoseconds elapsed since January 1, 1970 UTC. The result is undefined if the Unix time in nanoseconds cannot be represented by an int64 (a date before the year 1678 or after 2262).

Correct. Since the library doesn’t ask for Unix Time, but a time.Time. The library should return an error for times > year 2262.

When time.TIme.IsZero(), we silently ignore the value & do nothing. Can the SDK throw an error that Zero Times are not supported… either set a time of > 0 || NeverExpire.