From 11437db364c76d660d19922c6104e2748e1c80bc Mon Sep 17 00:00:00 2001 From: Khushi Kathuria Date: Tue, 3 Feb 2026 12:57:22 +0530 Subject: [PATCH 1/4] impl(bq_driver): Picosecond support --- .../bigquery/v2/minimal/benchmarks/benchmarks_config.cc | 6 ++++++ .../bigquery/v2/minimal/benchmarks/benchmarks_config.h | 1 + google/cloud/bigquery/v2/minimal/internal/job_request.cc | 1 + google/cloud/bigquery/v2/minimal/internal/job_request.h | 4 +++- 4 files changed, 11 insertions(+), 1 deletion(-) diff --git a/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.cc b/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.cc index fe7b0ed75cfec..01525e0a32c25 100644 --- a/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.cc +++ b/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.cc @@ -359,6 +359,12 @@ google::cloud::StatusOr JobConfig::ParseArgs( flags_.push_back( {"--use-int64-timestamp=", "outputs timestamp as usec int64", [this](std::string const& v) { use_int64_timestamp = (v == "true"); }}); + flags_.push_back( + {"--timestamp-output-format=", + "sets timestamp output format", + [this](std::string const& v) { + timestamp_output_format = v; + }}); flags_.push_back( {"--min-creation-time=", "min job creation time. If set, only jobs created after or at this " diff --git a/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.h b/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.h index aaf908fabf0c1..99a75a8840c03 100644 --- a/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.h +++ b/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.h @@ -100,6 +100,7 @@ struct JobConfig : public Config { int start_index = 0; int timeout_ms; bool use_int64_timestamp; + std::string timestamp_output_format; bigquery_v2_minimal_internal::Projection projection; bigquery_v2_minimal_internal::StateFilter state_filter; diff --git a/google/cloud/bigquery/v2/minimal/internal/job_request.cc b/google/cloud/bigquery/v2/minimal/internal/job_request.cc index d8a7d3bdf1afb..a8d318b8d7983 100644 --- a/google/cloud/bigquery/v2/minimal/internal/job_request.cc +++ b/google/cloud/bigquery/v2/minimal/internal/job_request.cc @@ -343,6 +343,7 @@ std::string DataFormatOptions::DebugString(absl::string_view name, int indent) const { return internal::DebugFormatter(name, options, indent) .Field("use_int64_timestamp", use_int64_timestamp) + .Field("timestamp_output_format",timestamp_output_format) .Build(); } diff --git a/google/cloud/bigquery/v2/minimal/internal/job_request.h b/google/cloud/bigquery/v2/minimal/internal/job_request.h index 2c59df70d2e51..c641ad81cdf9f 100644 --- a/google/cloud/bigquery/v2/minimal/internal/job_request.h +++ b/google/cloud/bigquery/v2/minimal/internal/job_request.h @@ -313,12 +313,14 @@ struct DataFormatOptions { DataFormatOptions() = default; bool use_int64_timestamp = false; + std::string timestamp_output_format = "FLOAT64"; std::string DebugString(absl::string_view name, TracingOptions const& options = {}, int indent = 0) const; }; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(DataFormatOptions, - use_int64_timestamp); + use_int64_timestamp, + timestamp_output_format); // Indicates the type of compute mode for the query stage. // From 42f9f7882607140e631ba87f6114a9f24459f765 Mon Sep 17 00:00:00 2001 From: Khushi Kathuria Date: Mon, 2 Mar 2026 11:43:15 +0530 Subject: [PATCH 2/4] impl(bq_driver): Changes --- .../cloud/bigquery/v2/minimal/internal/job_request_test.cc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/google/cloud/bigquery/v2/minimal/internal/job_request_test.cc b/google/cloud/bigquery/v2/minimal/internal/job_request_test.cc index 7b4de78b1de11..a4bc2c012feb0 100644 --- a/google/cloud/bigquery/v2/minimal/internal/job_request_test.cc +++ b/google/cloud/bigquery/v2/minimal/internal/job_request_test.cc @@ -1028,7 +1028,7 @@ TEST(PostQueryRequestTest, DebugString) { R"( parameter_value { value: "query-parameter-value" } })" R"( labels { key: "lk1" value: "lv1" } labels { key: "lk2" value: "lv2" })" R"( default_dataset { project_id: "2" dataset_id: "1" })" - R"( format_options { use_int64_timestamp: true })" + R"( format_options { use_int64_timestamp: true timestamp_output_format: FLOAT64 })" R"( job_creation_mode { value: "JOB_CREATION_MODE_UNSPECIFIED" } } })"); EXPECT_EQ( @@ -1049,7 +1049,7 @@ TEST(PostQueryRequestTest, DebugString) { R"( parameter_value { value: "query-p......" } })" R"( labels { key: "lk1" value: "lv1" } labels { key: "lk2" value: "lv2" })" R"( default_dataset { project_id: "2" dataset_id: "1" })" - R"( format_options { use_int64_timestamp: true })" + R"( format_options { use_int64_timestamp: true timestamp_output_format: FLOAT64 })" R"( job_creation_mode { value: "JOB_CRE......" } } })"); EXPECT_EQ(request.DebugString("PostQueryRequest", TracingOptions{}.SetOptions( @@ -1103,6 +1103,7 @@ TEST(PostQueryRequestTest, DebugString) { } format_options { use_int64_timestamp: true + timestamp_output_format: FLOAT64 } job_creation_mode { value: "JOB_CREATION_MODE_UNSPECIFIED" From 6098851a06f7cfb6de4657a3e3434a0092e624d4 Mon Sep 17 00:00:00 2001 From: khushikathuria008 Date: Thu, 5 Mar 2026 09:14:52 +0000 Subject: [PATCH 3/4] impl(bq_driver): Checkers --- .../bigquery/v2/minimal/benchmarks/benchmarks_config.cc | 7 ++----- google/cloud/bigquery/v2/minimal/internal/job_request.cc | 2 +- google/cloud/bigquery/v2/minimal/internal/job_request.h | 2 +- 3 files changed, 4 insertions(+), 7 deletions(-) diff --git a/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.cc b/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.cc index 7d9c931722d96..2112c9d398126 100644 --- a/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.cc +++ b/google/cloud/bigquery/v2/minimal/benchmarks/benchmarks_config.cc @@ -360,11 +360,8 @@ google::cloud::StatusOr JobConfig::ParseArgs( {"--use-int64-timestamp=", "outputs timestamp as usec int64", [this](std::string const& v) { use_int64_timestamp = (v == "true"); }}); flags_.push_back( - {"--timestamp-output-format=", - "sets timestamp output format", - [this](std::string const& v) { - timestamp_output_format = v; - }}); + {"--timestamp-output-format=", "sets timestamp output format", + [this](std::string const& v) { timestamp_output_format = v; }}); flags_.push_back( {"--min-creation-time=", "min job creation time. If set, only jobs created after or at this " diff --git a/google/cloud/bigquery/v2/minimal/internal/job_request.cc b/google/cloud/bigquery/v2/minimal/internal/job_request.cc index b06032b037aac..d3404627870fb 100644 --- a/google/cloud/bigquery/v2/minimal/internal/job_request.cc +++ b/google/cloud/bigquery/v2/minimal/internal/job_request.cc @@ -343,7 +343,7 @@ std::string DataFormatOptions::DebugString(absl::string_view name, int indent) const { return internal::DebugFormatter(name, options, indent) .Field("use_int64_timestamp", use_int64_timestamp) - .Field("timestamp_output_format",timestamp_output_format) + .Field("timestamp_output_format", timestamp_output_format) .Build(); } diff --git a/google/cloud/bigquery/v2/minimal/internal/job_request.h b/google/cloud/bigquery/v2/minimal/internal/job_request.h index c641ad81cdf9f..4416e70f20fda 100644 --- a/google/cloud/bigquery/v2/minimal/internal/job_request.h +++ b/google/cloud/bigquery/v2/minimal/internal/job_request.h @@ -319,7 +319,7 @@ struct DataFormatOptions { int indent = 0) const; }; NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT(DataFormatOptions, - use_int64_timestamp, + use_int64_timestamp, timestamp_output_format); // Indicates the type of compute mode for the query stage. From b7762fe320bc3a432ed5bc7a2653a614b3232515 Mon Sep 17 00:00:00 2001 From: khushikathuria008 Date: Fri, 6 Mar 2026 16:43:27 +0000 Subject: [PATCH 4/4] impl(bq_driver): Changes --- google/cloud/bigquery/v2/minimal/internal/job_request.h | 3 ++- .../cloud/bigquery/v2/minimal/internal/job_request_test.cc | 6 +++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/google/cloud/bigquery/v2/minimal/internal/job_request.h b/google/cloud/bigquery/v2/minimal/internal/job_request.h index 4416e70f20fda..f35d056d7bce5 100644 --- a/google/cloud/bigquery/v2/minimal/internal/job_request.h +++ b/google/cloud/bigquery/v2/minimal/internal/job_request.h @@ -311,9 +311,10 @@ class CancelJobRequest { struct DataFormatOptions { DataFormatOptions() = default; + bool use_int64_timestamp = false; + std::string timestamp_output_format = "TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED"; - std::string timestamp_output_format = "FLOAT64"; std::string DebugString(absl::string_view name, TracingOptions const& options = {}, int indent = 0) const; diff --git a/google/cloud/bigquery/v2/minimal/internal/job_request_test.cc b/google/cloud/bigquery/v2/minimal/internal/job_request_test.cc index 96b9c298dd38b..d1be2f64247a8 100644 --- a/google/cloud/bigquery/v2/minimal/internal/job_request_test.cc +++ b/google/cloud/bigquery/v2/minimal/internal/job_request_test.cc @@ -1028,7 +1028,7 @@ TEST(PostQueryRequestTest, DebugString) { R"( parameter_value { value: "query-parameter-value" } })" R"( labels { key: "lk1" value: "lv1" } labels { key: "lk2" value: "lv2" })" R"( default_dataset { project_id: "2" dataset_id: "1" })" - R"( format_options { use_int64_timestamp: true timestamp_output_format: FLOAT64 })" + R"( format_options { use_int64_timestamp: true timestamp_output_format: TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED })" R"( job_creation_mode { value: "JOB_CREATION_MODE_UNSPECIFIED" } } })"); EXPECT_EQ( @@ -1049,7 +1049,7 @@ TEST(PostQueryRequestTest, DebugString) { R"( parameter_value { value: "query-p......" } })" R"( labels { key: "lk1" value: "lv1" } labels { key: "lk2" value: "lv2" })" R"( default_dataset { project_id: "2" dataset_id: "1" })" - R"( format_options { use_int64_timestamp: true timestamp_output_format: FLOAT64 })" + R"( format_options { use_int64_timestamp: true timestamp_output_format: TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED })" R"( job_creation_mode { value: "JOB_CRE......" } } })"); EXPECT_EQ(request.DebugString("PostQueryRequest", TracingOptions{}.SetOptions( @@ -1103,7 +1103,7 @@ TEST(PostQueryRequestTest, DebugString) { } format_options { use_int64_timestamp: true - timestamp_output_format: FLOAT64 + timestamp_output_format: TIMESTAMP_OUTPUT_FORMAT_UNSPECIFIED } job_creation_mode { value: "JOB_CREATION_MODE_UNSPECIFIED"