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

Reply via email to