Boundedness
Does the input end? A file does. A Kafka topic does not. The same SQL means different things over each, so Streamform records the answer on every node of the plan and refuses SQL whose meaning depends on an ending that never comes.
Where it comes from
Boundedness is derived from the source’s connector, never guessed from the SQL:
| Connector | Boundedness |
|---|---|
kafka | Unbounded: the stream never ends |
file | Bounded: the input is finite |
Every operator downstream carries its input’s boundedness forward. explain shows it on each node as boundedness=Unbounded or boundedness=Bounded.
What it changes
A global ORDER BY needs the whole input to produce a final ordering. Over a bounded file that is a sort; over an unbounded topic it can never finish, so Streamform refuses it at check:
error: could not compile model `sorted`: model `sorted`: ORDER BY cannot produce a final
ordering over an unbounded input; remove it, or sort downstream of a bounded materialization
The same model over a file source is accepted. This is the first and simplest of the semantics a SQL statement alone cannot express, and it is why sources are declared rather than inferred.
Later
Windows, watermarks, and event time (roadmap phases 7 and 8) are the next set of meanings that depend on time and on the input never ending. They arrive as first-class plan properties in the same way.