A Project needs one input. It’s not negotiable.
If you want to generate a single row, use RelBuilder.values(). There are
several overloaded forms, but for your case probably
RelBuilder builder;
builder.values(“i”, 123)
.build();
will do the trick. The VALUES relational operator is a leaf: it has no inputs,
and produces a constant relation. In SQL terms, you are generating
VALUES (123);
Other overloaded forms of the overloaded values method allow multiple columns
and multiple rows, e.g.
VALUES (123, ‘a’), (234, ‘bcd’);
Your mind has probably been poisoned by MySQL and Postgres’ non-standard
FROM-less queries:
SELECT 123;
Julian
> On Nov 19, 2015, at 4:16 PM, Andy Grove <[email protected]> wrote:
>
> Hi,
>
> I'm now working on a project to translate some proprietary SQL to a Calcite
> relational plan using the RelBuilder API.
>
> I have a question about literal projections. I can do this OK:
>
> // SELECT 123 FROM EMP
> builder
> .scan("EMP")
> .project(builder.literal(123))
> .build();
>
> However, if I try and do "SELECT 123" without a relation, it fails with an
> ArrayIndexOutOfBoundsException.
>
> // SELECT 123
> builder
> .project(builder.literal(123))
> .build();
>
> Is there an extra step I need to add a fake relation, or is this a bug? I'm
> happy to dig in and fix this if it is a bug, but wanted to verify first if
> this expected to work or not.
>
> Thanks,
>
> Andy.
>
> --
>
> Andy Grove
> Chief Architect
> AgilData - Simple Streaming SQL that Scales
> www.agildata.com