risingwavelabs/risingwave · error · ValueEncodingError
invalid Time value encoding: secs: {0} nano: {1}
Error message
invalid Time value encoding: secs: {0} nano: {1} What it means
`ValueEncodingError::InvalidTimeEncoding` is raised when decoding a value-encoded TIME: time is stored as a (secs, nanos) pair where secs is seconds since midnight (must be < 86400) and nanos < 1_000_000_000; values outside these constraints cannot form a valid `NaiveTime`. The message reports both stored values.
Source
Thrown at src/common/src/util/value_encoding/error.rs:27
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use thiserror::Error;
#[derive(Error, Debug)]
pub enum ValueEncodingError {
#[error("Invalid bool value encoding: {0}")]
InvalidBoolEncoding(u8),
#[error("Invalid UTF8 value encoding: {0}")]
InvalidUtf8(#[from] std::string::FromUtf8Error),
#[error("Invalid Date value encoding: days: {0}")]
InvalidDateEncoding(i32),
#[error("invalid Timestamp value encoding: secs: {0} nsecs: {1}")]
InvalidTimestampEncoding(i64, u32),
#[error("invalid Time value encoding: secs: {0} nano: {1}")]
InvalidTimeEncoding(u32, u32),
#[error("Invalid null tag value encoding: {0}")]
InvalidTagEncoding(u8),
#[error("Invalid jsonb encoding")]
InvalidJsonbEncoding,
#[error("Invalid variant encoding")]
InvalidVariantEncoding,
#[error("Invalid struct encoding: {0}")]
InvalidStructEncoding(
#[source]
#[backtrace]
crate::array::ArrayError,
),
#[error("Invalid list encoding: {0}")]
InvalidListEncoding(
#[source]
#[backtrace]
crate::array::ArrayError,View on GitHub (pinned to 6469eb736d)
Solutions
- Ensure secs < 86400 and nanos < 1_000_000_000 before encoding/decoding a TIME
- If your writer stores micros/millis-of-day, convert to (secs, nanos) first
- Validate offsets/endianness when slicing value-encoded buffers manually
- Regenerate data using RisingWave's value-encoding APIs
Example fix
// before let (secs, nano) = (86_400u32, 0u32); // equals midnight next day — invalid // after let (secs, nano) = (86_399u32, 999_999_999u32); // max valid time-of-day
Defensive patterns
Strategy: validation
Validate before calling
// validate time-of-day pair before encoding a TIME
fn is_valid_time(secs: u32, nano: u32) -> bool {
secs < 86_400 && nano < 1_000_000_000
&& chrono::NaiveTime::from_num_seconds_from_midnight_opt(secs, nano).is_some()
}
Try / catch
match NaiveTime::try_from_value_encoding(bytes) {
Ok(t) => t,
Err(ValueEncodingError::InvalidTimeEncoding(secs, nano)) => {
return Err(anyhow!("bad time secs={secs} nano={nano}"));
}
Err(e) => return Err(e.into()),
} Prevention
- Ensure secs-of-day < 86400 and nanos < 1e9 before encoding
- Convert millis/micros-of-day into (secs, nanos) at the producer
- Avoid hand-rolled TIME serialization; use value-encoding APIs
When it happens
Trigger: Decoding a TIME whose secs >= 86400 or whose nanos exceed 999_999_999, wrong-offset reads that read the wrong bytes as the pair, or external writers encoding total-millis/secs-of-day in the wrong field.
Common situations: Hand-rolled encoders writing 24h+ values or epoch-style numbers into TIME fields, corrupted/truncated payloads, unit confusion (micros vs nanos) between writer and reader.
Understand the failure class
Background: "value must be between 0 and 1" / "out of range" / "must not be negative" errors: fixing range-validation failures across open-source libraries — this error's family across 42 libraries.
Related errors
- Invalid bool value encoding: {0}
- Invalid Date value encoding: days: {0}
- invalid Timestamp value encoding: secs: {0} nsecs: {1}
- Invalid null tag value encoding: {0}
- Invalid jsonb encoding
AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11).
Data as JSON: /api/errors/7b1a895cb4c9def8.
Report an issue: GitHub.