{"record":{"id":"73c8e5c7ce21a602","repo":"apache/beam","slug":"unknown-timestamp-truncation-option-s","errorCode":null,"errorMessage":"Unknown timestamp truncation option: %s","messagePattern":"Unknown timestamp truncation option: (.+?)","errorType":"validation","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtils.java","lineNumber":1041,"sourceCode":"      case BYTE:\n      case INT16:\n      case INT32:\n      case INT64:\n      case FLOAT:\n      case DOUBLE:\n      case STRING:\n      case BYTES:\n      case BOOLEAN:\n        return convertAvroPrimitiveTypes(beamFieldTypeName, avroValue);\n      case DATETIME:\n        // Expecting value in microseconds.\n        switch (options.getTruncateTimestamps()) {\n          case TRUNCATE:\n            return truncateToMillis(avroValue);\n          case REJECT:\n            return safeToMillis(avroValue);\n          default:\n            throw new IllegalArgumentException(\n                String.format(\n                    \"Unknown timestamp truncation option: %s\", options.getTruncateTimestamps()));\n        }\n      case DECIMAL:\n        return convertAvroNumeric(avroValue);\n      case ARRAY:\n        return convertAvroArray(beamFieldType, avroValue, options);\n      case LOGICAL_TYPE:\n        LogicalType<?, ?> logicalType =\n            Preconditions.checkArgumentNotNull(beamFieldType.getLogicalType());\n        String identifier = logicalType.getIdentifier();\n        if (SqlTypes.DATE.getIdentifier().equals(identifier)) {\n          return convertAvroDate(avroValue);\n        } else if (SqlTypes.TIME.getIdentifier().equals(identifier)) {\n          return convertAvroTime(avroValue);\n        } else if (SqlTypes.DATETIME.getIdentifier().equals(identifier)) {\n          return convertAvroDateTime(avroValue);\n        } else if (SQL_DATE_TIME_TYPES.contains(identifier)) {","sourceCodeStart":1023,"sourceCodeEnd":1059,"githubUrl":"https://github.com/apache/beam/blob/12126d8942aaf848030c478b4c6a28c6af861c66/sdks/java/io/google-cloud-platform/src/main/java/org/apache/beam/sdk/io/gcp/bigquery/BigQueryUtils.java#L1023-L1059","documentation":"Thrown by BigQueryUtils.convertAvroFormat when converting a DATETIME-typed Avro value from BigQuery and the ConversionOptions' TruncateTimestamps value is neither TRUNCATE nor REJECT. This is an internal default-branch guard: the enum should only ever have those two values, so hitting it means an unknown/invalid enum value reached the converter. It is an IllegalArgumentException, not a data error.","triggerScenarios":"BigQueryIO.readTableRows / avro conversion path is invoked with a ConversionOptions whose getTruncateTimestamps() returns a value outside {TRUNCATE, REJECT} — e.g. a custom or deserialized ConversionOptions, or a future enum constant used with an older Beam version. Also hit at BigQueryUtils.java:1066 for SQL_DATE_TIME_TYPES logical types.","commonSituations":"Mixing Beam SDK versions (e.g. pipeline built with newer Beam that added an enum constant, run with older runners); custom code constructing ConversionOptions programmatically; custom BigQueryIO forks copying this switch but extending the enum.","solutions":["Use only the two supported values: BigQueryIO.withTruncatedTimestamps() (TRUNCATE) or the default REJECT mode; do not construct ConversionOptions manually.","Ensure all pipeline stages and runners use the same Beam SDK version as the code compiling this switch.","Rebuild against a single Beam version so enum and consumer are in sync.","If you maintain a fork, replace the default branch with a hard failure listing valid options or route unknown values to REJECT."],"exampleFix":"// before\nConversionOptions opts = new ConversionOptions(someEnumFromConfig);\n// after\nConversionOptions opts = useTruncation\n    ? ConversionOptions.truncateTimestamps()\n    : ConversionOptions.rejectTimestamps(); // only supported enum values","handlingStrategy":"validation","validationCode":"// Java: validate the option before conversion\nif (opts.getTruncateTimestamps() != ConversionOptions.TruncateTimestamps.TRUNCATE\n    && opts.getTruncateTimestamps() != ConversionOptions.TruncateTimestamps.REJECT) {\n  throw new IllegalArgumentException(\"truncateTimestamps must be TRUNCATE or REJECT\");\n}","typeGuard":null,"tryCatchPattern":"try { return BigQueryIO.readTableRows().from(table).apply(...); } catch (IllegalArgumentException e) { if (e.getMessage().startsWith(\"Unknown timestamp truncation option\")) { /* rebuild options with TRUNCATE/REJECT and retry */ } throw e; }","preventionTips":["Only enable truncation via BigQueryIO.withTruncatedTimestamps(); never hand-build ConversionOptions.","Pin all pipeline stages and runners to the same Beam SDK version."],"tags":["java","beam","bigquery","avro","enum"],"backgroundTag":"invalid-enum-value","analyzedSha":"12126d8942aaf848030c478b4c6a28c6af861c66","analyzedAt":"2026-09-13T01:50:10.254Z","contentChangedAt":"2026-09-13T01:50:10.254Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}