Ahh, thank you Julian, appreciate that you're always answering my questions.
That all makes sense. I suppose the downside of using these incredibly handy test helpers/utils is that I haven't a clue what's actually going on, haha. Will try to figure out how to manually perform the process of creating a proper "Connection" object and adding the schemas to it. On the bright side, this was the very last blocker to having a prototype of my project working end-to-end! Took me almost a month and I had to ask for a lot of help, but I'm just ecstatic that it works =D On Sun, Jan 2, 2022 at 1:16 AM Julian Hyde <jhyde.apa...@gmail.com> wrote: > Gavin, > > The reason is that you need two “ingredients” to execute a query. You need > the expression, and you need a connection. The expression is written in > terms of relations, which have a fully-qualified path, > “schema.subSchema.tableName”. But only the connection (to be precise, its > root schema) contains the actual table objects. > > Usually you get a RelRunner from a connection. RelRunners.run seems to > offer a short-cut — it creates a dummy connection using “jdbc:calcite:”. > But you get what you pay for. This connection is empty. Its root schema > contains no sub-schemas, and no tables. It’s only good for executing > statements that do not reference any tables. > > Sorry to hear that you had two days of frustration. > > Julian > > > > > On Jan 1, 2022, at 10:44 AM, Gavin Ray <ray.gavi...@gmail.com> wrote: > > > > After two days of banging my head against the wall, I figured it out! > > > > It only works if I run the query in the context of a "CalciteConnection", > > and I use "connection.unwrap()" to create the "RelRunner". > > > > WRONG: > > ========================== > > val run = RelRunners.run(bestExp) > > val resultSet = run.executeQuery() > > > > RIGHT: > > ========================== > > val runner = connection.unwrap(RelRunner::class.java) > > val resultSet = runner.prepareStatement(bestExp).executeQuery() > > > > Why is this out of curiosity? > > > > I only figured this out by mimicking the "FrameworksTest" case below, > > so I don't understand the "why". > > > > > https://github.com/apache/calcite/blob/de847c38f3544f9c7282984f32dc1093bdb2fb60/core/src/test/java/org/apache/calcite/tools/FrameworksTest.java#L342-L376 > > > > > > > > On Fri, Dec 31, 2021 at 6:22 PM Gavin Ray <ray.gavi...@gmail.com> wrote: > > > >> It appears to be because "getSubSchema" in > >> "calcite.jdbc.CalciteSchema.SchemaPlusImpl" has a "subSchemaMap" that > loses > >> the "hr" schema and only contains "metadata" [0] > >> > >> But if I call the same function the map shows "hr" is present [1] which > >> doesn't make sense to me > >> > >> [0]: https://imgur.com/djlkBVf > >> [1]: https://imgur.com/eEOvjdS > >> > >> > >> > >> > >> > >> > >> > >> On Fri, Dec 31, 2021 at 5:20 PM Gavin Ray <ray.gavi...@gmail.com> > wrote: > >> > >>> Unsure of where this is coming from/how to debug it. > >>> (The code I am using is below, taken from Calcite examples) > >>> > >>> If I print out the sub-schema names of "rootSchema", and their tables, > I > >>> get: > >>> > >>> subSchemaNames: [hr, metadata] > >>> "hr" subSchema table names: [depts, emps] > >>> "metadata" subSchema table names: [COLUMNS, TABLES] > >>> > >>> So I am not certain what value is being passed that it would fail > >>> a "schema.getSubSchema()" call, or where to put a breakpoint to debug > >>> that. > >>> > >>> Does anyone spot something I'm doing that's clearly wrong, or have an > idea > >>> where I could look to find the code that's causing this? > >>> > >>> Stacktrace winds up at "Baz", so I think it's generated code > >>> Thank you > >>> =========================================================== > >>> > >>> fun main(args: Array<String>) { > >>> val hr = Frameworks.createRootSchema(true).add("hr", > >>> HrClusteredSchema()) > >>> > >>> val frameworkConfig: FrameworkConfig = Frameworks > >>> .newConfigBuilder() > >>> .parserConfig(SqlParser.config().withCaseSensitive(false)) > >>> .defaultSchema(hr) > >>> .build() > >>> > >>> Frameworks.withPlanner(::test, frameworkConfig) > >>> } > >>> > >>> fun test(cluster: RelOptCluster, relOptSchema: RelOptSchema, > rootSchema: > >>> Schema) { > >>> val planner = cluster.planner > >>> val relBuilder: RelBuilder = > >>> RelFactories.LOGICAL_BUILDER.create(cluster, relOptSchema) > >>> > >>> val relRoot: RelNode = // ... > >>> val desiredTraits = > >>> cluster.traitSet().replace(EnumerableConvention.INSTANCE) > >>> val newRoot = cluster.planner.changeTraits(relRoot, desiredTraits) > >>> > >>> cluster.planner.root = newRoot > >>> val bestExp = cluster.planner.findBestExp() > >>> val run = RelRunners.run(bestExp) > >>> val resultSet = run.executeQuery() > >>> } > >>> > >> > >