@@ -1215,6 +1215,56 @@ static GoogleCredentials loadCredentials(String credentialFile) {
12151215 }
12161216 }
12171217
1218+ @ Test
1219+ void testLosslessMaxTimestampIntegration () throws InterruptedException {
1220+ String query = "SELECT TIMESTAMP '9999-12-31 23:59:59.999999 UTC' as max_ts" ;
1221+ QueryJobConfiguration config = QueryJobConfiguration .newBuilder (query ).build ();
1222+
1223+ // 1. Test lossless 64-bit integer parsing (useInt64Timestamps = true)
1224+ DataFormatOptions losslessOptions =
1225+ DataFormatOptions .newBuilder ().useInt64Timestamp (true ).build ();
1226+ BigQuery losslessBigQuery =
1227+ bigquery .getOptions ().toBuilder ()
1228+ .setDataFormatOptions (losslessOptions )
1229+ .build ()
1230+ .getService ();
1231+
1232+ TableResult losslessResult = losslessBigQuery .query (config );
1233+ assertEquals (1L , losslessResult .getTotalRows ());
1234+ for (FieldValueList row : losslessResult .iterateAll ()) {
1235+ long exactMicros = row .get ("max_ts" ).getTimestampValue ();
1236+ assertEquals (253402300799999999L , exactMicros );
1237+ }
1238+
1239+ // 2. Test lossy FLOAT64 rounding behavior (useInt64Timestamps = false)
1240+ DataFormatOptions floatOptions =
1241+ DataFormatOptions .newBuilder ().useInt64Timestamp (false ).build ();
1242+ BigQuery floatBigQuery =
1243+ bigquery .getOptions ().toBuilder ().setDataFormatOptions (floatOptions ).build ().getService ();
1244+
1245+ TableResult floatResult = floatBigQuery .query (config );
1246+ assertEquals (1L , floatResult .getTotalRows ());
1247+ for (FieldValueList row : floatResult .iterateAll ()) {
1248+ long roundedMicros = row .get ("max_ts" ).getTimestampValue ();
1249+ assertEquals (253402300800000000L , roundedMicros );
1250+ }
1251+
1252+ // 3. Test ISO8601 timestamp formatting
1253+ DataFormatOptions isoOptions =
1254+ DataFormatOptions .newBuilder ()
1255+ .timestampFormatOptions (DataFormatOptions .TimestampFormatOptions .ISO8601_STRING )
1256+ .build ();
1257+ BigQuery isoBigQuery =
1258+ bigquery .getOptions ().toBuilder ().setDataFormatOptions (isoOptions ).build ().getService ();
1259+
1260+ TableResult isoResult = isoBigQuery .query (config );
1261+ assertEquals (1L , isoResult .getTotalRows ());
1262+ for (FieldValueList row : isoResult .iterateAll ()) {
1263+ String isoValue = row .get ("max_ts" ).getStringValue ();
1264+ assertEquals ("9999-12-31T23:59:59.999999Z" , isoValue );
1265+ }
1266+ }
1267+
12181268 @ Test
12191269 void testListDatasets () {
12201270 Page <Dataset > datasets = bigquery .listDatasets ("bigquery-public-data" );
0 commit comments