Apache Calcite release history

For a full list of releases, see github.

1.0.0-incubating / 2015-01-31

Calcite's first major release.

Since the previous release we have re-organized the into the org.apache.calcite namespace. To make migration of your code easier, we have described the mapping from old to new class names as an attachment to [CALCITE-296].

The release adds SQL support for GROUPING SETS, EXTEND, UPSERT and sequences; a remote JDBC driver; improvements to the planner engine and built-in planner rules; improvements to the algorithms that implement the relational algebra, including an interpreter that can evaluate queries without compilation; and fixes about 30 bugs.

New features

  • SQL
    • [CALCITE-494] Support NEXT/CURRENT VALUE FOR syntax for using sequences
    • [CALCITE-492] Support UPSERT statement in parser
    • [CALCITE-493] Add EXTEND clause, for defining columns and their types at query/DML time
    • [CALCITE-497] Support optional qualifier for column name references
    • [CALCITE-356] Allow column references of the form schema.table.column
    • [CALCITE-462] Allow table functions in LATERAL expression
    • [CALCITE-282] Add {fn QUARTER(date)} function (Benoy Antony)
    • Grouping sets
      • [CALCITE-370] Support GROUPING SETS, CUBE, ROLLUP in SQL and algebra
      • [CALCITE-512] Add GROUP_ID,GROUPING_ID, GROUPING functions
  • Planner rule improvements
    • [CALCITE-92] Optimize away Project that merely renames fields
    • Detect and merge duplicate predicates AND(x, y, x) to AND(x, y) in more circumstances
    • [CALCITE-557] Speed up planning by never creating AbstractConverter
    • [CALCITE-545] When a projected expression can only have one value, replace with that constant
    • Grouping sets
      • [CALCITE-542] Support for Aggregate with grouping sets in RelMdColumnOrigins (Jesus Camacho Rodriguez)
      • [CALCITE-533] Support for grouping sets in FilterAggregateTransposeRule (Jesus Camacho Rodriguez)
      • [CALCITE-532] Support for grouping sets in AggregateFilterTransposeRule (Jesus Camacho Rodriguez)
      • [CALCITE-513] Support for grouping sets in AggregateProjectMergeRule (Jesus Camacho Rodriguez)
      • [CALCITE-510] Support for grouping sets in AggregateExpandDistinctAggregatesRule (Jesus Camacho Rodriguez)
      • [CALCITE-502] Support for grouping sets in AggregateUnionTransposeRule (Jesus Camacho Rodriguez)
      • [CALCITE-503] Tests to check rules on Aggregate operator without grouping sets (Jesus Camacho Rodriguez)
  • Algorithms
    • [CALCITE-451] Implement theta join, inner and outer, in enumerable convention
    • [CALCITE-489] Update Correlate mechanics and implement EnumerableCorrelate (aka nested loops join)
    • [CALCITE-544] Implement Union in interpreter
    • [CALCITE-562] Implement inner Join in interpreter and improve handling of scalar expressions
    • [CALCITE-543] Implement Aggregate (including GROUPING SETS) in interpreter (Jacques Nadeau)
    • In progress towards [CALCITE-558] add BINDABLE convention (but ENUMERABLE is still the default), and add ArrayBindable and Scalar interfaces
  • Remote driver
    • [CALCITE-93] Calcite RPC server
    • [CALCITE-94] Remote JDBC driver
    • Make JsonHandler and JsonService thread-safe

API changes

  • The great code re-org
    • [CALCITE-296] Re-organize package structure
    • [CALCITE-419] Naming convention for planner rules
    • [CALCITE-306] Standardize code style for “import package.*;”
    • [CALCITE-474] Clean up rule naming in order to support enabling/disabling rules
    • [CALCITE-460] Add ImmutableBitSet and replace uses of BitSet
    • [CALCITE-479] Migrate RelNode.getChildExps to RelNode.accept(RexShuttle)
    • [CALCITE-527] Drop rowType field and constructor/copy argument of Calc
  • Add linq4j and example-csv modules
    • Remove unused packages in linq4j, and fix checkstyle issues in linq4j and csv
    • Add calcite-linq4j and calcite-example-csv as POM sub-modules
    • Import ‘optiq-csv’ project as ‘example/csv/’, and add Apache headers
    • Import ‘linq4j’ project, and add Apache headers
    • [CALCITE-478] Move CSV tutorial (Siva Narayanan)
  • [CALCITE-464] Make parser accept configurable max length for SQL identifier
  • [CALCITE-465] Remove OneRow and Empty relational expressions; Values will suffice

Bug-fixes and internal changes

  • Build improvements
    • [CALCITE-541] Update maven-source-plugin to 2.4 to get speedup in jdk 1.8
    • [CALCITE-537] Skip overwrite of NOTICE, DEPENDENCIES, and LICENSE files
    • [CALCITE-538] Generate Parser.jj only at first build
    • [CALCITE-539] Avoid rewrite of org-apache-calcite-jdbc.properties
    • [CALCITE-540] Create git.properties file only at first build. This saves time in development at a cost of stale git.properties
    • [CALCITE-536] Add @PackageMarker to package-info.java so maven-compiler skips compilation when the sources are unchanged
    • [CALCITE-535] Support skip overwrite in hydromatic-resource
  • [CALCITE-582] EnumerableTableScan broken when table has single column
  • [CALCITE-575] Variant of ProjectRemoveRule that considers a project trivial only if its field names are identical (John Pullokkaran)
  • [CALCITE-571] ReduceExpressionsRule tries to reduce SemiJoin condition to non-equi condition
  • [CALCITE-568] Upgrade to a version of pentaho-aggdesigner that does not pull in servlet-api
  • [CALCITE-567] Make quidem dependency have scope “test”
  • [CALCITE-570] ReduceExpressionsRule throws “duplicate key” exception
  • [CALCITE-561] Upgrade parent POM
  • [CALCITE-458] ArrayIndexOutOfBoundsException when using just a single column in interpreter
  • Fix spurious extra row from FULL JOIN
  • [CALCITE-554] Outer join over NULL keys generates wrong result
  • [CALCITE-489] Teach CalciteAssert to respect multiple settings
  • [CALCITE-516] GROUP BY on a CASE expression containing IN predicate fails (Aman Sinha)
  • [CALCITE-552] Upgrade tpcds (which depends on an old version of guava)
  • Copy identifier when fully-qualifying, so column aliases have the right case
  • [CALCITE-548] Extend induce method to return CUBE and ROLLUP (Jesus Camacho Rodriguez)
    • Simplify Group.induce by assuming that group sets are sorted
  • Test case for [CALCITE-212] Join condition with OR
  • [CALCITE-550] Case-insensitive matching of sub-query columns fails
    • Add more unit tests (Jinfeng Ni)
  • [CALCITE-448] FilterIntoJoinRule creates filters containing invalid RexInputRef
  • When registering a RelNode, be tolerant if it is equivalent to a RelNode with different traits
  • [CALCITE-547] Set nullability while inferring return type of item(any,...) operator
  • In Travis CI, enable containers, and cache .m2 directory
  • [CALCITE-534] Missing implementation of ResultSetMetaData.getColumnClassName (Knut Forkalsrud)
  • [CALCITE-506] Update EnumerableRelImplementor.stash so it is suitable for all kinds of classes
  • Merge join algorithm for Enumerables
  • Efficient Enumerable over random-access list
  • Add a test that calls all functions with arguments of all types that they claim to accept
  • [CALCITE-511] copy method in LogicalAggregate not copying the indicator value properly
  • Add a model that has lattices and works against HSQLDB
  • [CALCITE-509] RelMdColumnUniqueness uses ImmutableBitSet.Builder twice, gets NullPointerException
  • [CALCITE-488] Enumerable<Holder> does not work if where Holder is a custom class with a single field; Calcite tries to treat it as SCALAR due to premature JavaRowFormat.optimize
  • [CALCITE-352] Throw exception if ResultSet.next() is called after close()
  • [CALCITE-403] Enumerable gives NullPointerException with NOT on nullable expression
  • [CALCITE-469] Update example/csv README.md instructions
  • Document WITH, LATERAL, GROUPING SETS, CUBE, ROLLUP; add descriptions for all built-in functions and operators
  • [CALCITE-470] Print warning when column type hint is not understood; Update EMPS.deptno column Integer → int
  • Fix Linq4j.product; the cartesian product of 0 attributes is one row of 0 attributes
  • Update link optiq-mat-plugin → mat-calcite-plugin
  • [CALCITE-467] Incorrect namespace in package-info.java
  • Add headers, to appease the RAT
  • [CALCITE-446] CSV adapter should read from directory relative to the model file
  • Add examples of scannable and filterable tables, matching [CALCITE-436] Simpler SPI to query Table
  • Fix JdbcTest.testVersion now that version is 1.0
  • Update release HOWTO

0.9.2-incubating / 2014-11-05

A fairly minor release, and last release before we rename all of the packages and lots of classes, in what we expect to call 1.0. If you have an existing application, it's worth upgrading to this first, before you move on to 1.0.

New features

  • [CALCITE-436] Simpler SPI to query Table

API changes

  • [CALCITE-447] Change semi-join rules to make use of factories
  • [CALCITE-442 Add RelOptRuleOperand constructor that takes a predicate

Bug-fixes and internal changes

  • [CALCITE-397] SELECT DISTINCT * on reflective schema gives ClassCastException at runtime
  • Various lattice improvements.
  • sqlline: Looking for class-path in inconsistent locations.
  • Re-order test suite, so that fast tests are run first.
  • [CALCITE-444] Filters wrongly pushed into full outer join
  • Make it more convenient to unit test RelMetadataQuery, and add some more tests for [CALCITE-443]
  • [CALCITE-443] getPredicates from a Union is not correct
  • Update references to web sites, git repositories, jira, mailing lists, travis CI now that [INFRA-8413] is fixed
  • [CALCITE-435] FilterAggregateTransposeRule loses conditions that cannot be pushed
  • [CALCITE-435] LoptOptimizeJoinRule incorrectly re-orders outer joins
  • [CALCITE-439] SqlValidatorUtil.uniquify() may not terminate under some conditions
  • [CALCITE-438] Push predicates through SemiJoinRel
  • Add test case for LIKE ... ESCAPE.
  • HOWTO: Modify release instructions.
  • Update DiffRepository documentation.
  • Add tests for windowed aggregates without ORDER BY. (Works already.)

0.9.1-incubating / 2014-10-02

This is the first release as Calcite. (The project was previously called Optiq.)

New features

  • [CALCITE-430] Rename project from Optiq to Calcite
  • [CALCITE-426] Pool JDBC data sources, to make it easier to pool connections
  • [CALCITE-416] Execute logical RelNodes using an interpreter
  • [CALCITE-376] Move SqlRun into its own artifact, Quidem.
  • [CALCITE-269] MongoDB result sets larger than 16MB
  • [CALCITE-373] NULL values in NOT IN sub-queries
  • SQL functions:
    • [CALCITE-422] Add REGR_SXX and REGR_SYY regression functions
    • [CALCITE-421] Add COVAR_POP and COVAR_SAMP aggregate functions
  • Planner rules:
    • [CALCITE-425] Add FilterAggregateTransposeRule, that pushes a filter through an aggregate
    • [CALCITE-399] Factorize common AND factors out of OR predicates
    • [CALCITE-404] MergeProjectRule should not construct RexPrograms for simple mappings
    • [CALCITE-394] Add RexUtil.toCnf(), to convert expressions to conjunctive normal form (CNF)
    • [CALCITE-389] MergeFilterRule should flatten AND condition
  • Lattices:
    • [CALCITE-428] Use optimization algorithm to suggest which tiles of a lattice to materialize
    • [CALCITE-410] Allow lattice tiles to satisfy a query by rolling up
    • [CALCITE-406] Add tile and measure elements to lattice model element
    • Now, a lattice can materialize an aggregate-join and use it in a subsequent query.
    • [CALCITE-402] Lattice should create materializations on demand
    • [CALCITE-344] Lattice data structure
  • Field trimmer:
    • [CALCITE-408] Make FieldTrimmer work with RelNode base classes
    • [CALCITE-388] Handle semi-joins in field trimmer
    • [CALCITE-395] Make FieldTrimmer.trimFields(SetOp) generate ProjectRel instead of CalcRel
    • [CALCITE-393] If no fields are projected from a table, field trimmer should project a dummy expression

API changes

  • [CALCITE-413] Add RelDataTypeSystem plugin, allowing different max precision of a DECIMAL
  • In Planner, query de-correlation no longer requires state in a SqlToRelConverter.
  • Factories:
    • [CALCITE-392] RelFieldTrimmer should use factory to create new rel nodes
    • [CALCITE-382] Refactoring rules to use factories
    • [CALCITE-398] Move CalcRel.createProject methods to RelOptUtil
    • [CALCITE-396] Change return type of JoinFactory.createJoin(); add SemiJoinFactory

Bug-fixes and internal changes

  • [CALCITE-386] Fix NOTICE
  • Add tests inspired by Derby bugs.
  • Add recent presentation to README.md.
  • [CALCITE-427] Off-by-one issues in RemoveDistinctAggregateRule, AggregateFilterTransposeRule
  • [CALCITE-414] Bad class name in sqlline shell script
  • Bad package name in package-info.java was causing errors in Eclipse.
  • [CALCITE-412] RelFieldTrimmer: when trimming SortRel, the collation and trait set don't match
  • Add test case for [CALCITE-411] Duplicate column aliases
  • [CALCITE-407] RemoveTrivialProjectRule drops child node's traits
  • [CALCITE-409] PushFilterPastProjectRule should not push filters past windowed aggregates
  • Fix tests on Windows.
  • Don‘t load FoodMartQuerySet unless we have to. It’s big.
  • Enable connection pooling in test suite.
  • [CALCITE-384] Add apache- prefix to tarball and directory within tarball
  • Freeze hive fmpp > freemarker plugin dependency.
  • Upgrade Janino
  • Removed hardcoded foodmart schema information
  • [CALCITE-387] CompileException when cast TRUE to nullable boolean
  • Temporary fix for [CALCITE-390] Transitive inference (RelMdPredicates) doesn't handle semi-join
  • [CALCITE-385] Change comment style for Java headers
  • Disable test that is inconistent between JDK 1.7 and 1.8.
  • Fix git-commit-id-plugin error when running in Travis-CI.
  • [CALCITE-381] Remove plugin versions from the &lt;plugins&gt; tag in root pom
  • [CALCITE-383] Each jar should have a git.properties file describing its exact version
  • Fix mvn site on JDK 1.8 and enable in Travis-CI.
  • Status icon based on master branch, not whichever branch happened to build most recently.
  • HOWTO:
    • Document how to build from git, and how to get jars from maven repo.
    • Optiq web site
    • Template emails for Apache votes
    • Update JIRA cases following release
    • Instructions for making and verifying a release

0.9.0-incubating / 2014-08-19

This is the first release under the Apache incubator process.

New features

  • [CALCITE-371] Implement JOIN whose ON clause contains mixed equi and theta
  • [CALCITE-369] Add EnumerableSemiJoinRel, implementation of semi-join in enumerable convention
  • Add class Strong, for detecting null-rejecting predicates.
  • [CALCITE-368] Add SemiJoinRule, planner rule to convert project-join-aggregate into semi-join
  • [CALCITE-367] PushFilterPastJoinRule should strengthen join type
  • Add EquiJoinRel, base class for joins known to be equi-joins.
  • Implement CAST(&lt;string&gt; AS &lt;datetime&gt;) and &lt;datetime&gt; + &lt;interval&gt;.
  • [CALCITE-360] Introduce a rule to infer predicates from equi-join conditions
  • [CALCITE-349] Add heuristic join-optimizer that can generate bushy joins
  • [CALCITE-346] Add commutative join rule
  • [CALCITE-347] In SqlRun, add !plan command
  • [CALCITE-314] Allow simple UDFs based on methods
  • [CALCITE-327] Rules should use base class to find rule match & use factory for object creation
  • [CALCITE-316] In SqlRun, match output regardless of order if ORDER BY not present
  • [CALCITE-300] Support multiple parameters in COUNT(DISTINCT x, y, ...)

API changes

  • [CALCITE-343] RelDecorrelator should build its own mappings, not inherit from SqlToRelConverter
  • Remove deprecated methods.
  • Convert Hook to use Guava Function (was linq4j Function1).
  • Add fluent method withHook, to more easily add hooks in tests.
  • [CALCITE-321] Add support for overriding implementation of CompoundIdentifier in SqlParser.
  • [CALCITE-322] Add support for SqlExplain, SqlOrderBy and SqlWith to support SqlShuttle use.
  • [CALCITE-323] Override SqlUnresolvedFunction.inferReturnType() to return ANY type so framework implementors can support late bound function implementations.
  • [CALCITE-324] Add ViewExpander for Planner in Frameworks. Expose additional properties of ViewTable to allow subclassing.
  • [CALCITE-247] Add Context and FrameworkConfig

Bug-fixes and internal changes

  • [CALCITE-380] Downgrade to Guava 11.0.2
  • Move several .md files into new ‘doc’ directory, to keep the root directory simple.
  • Add DISCLAIMER
  • Update history and HOWTO
  • [CALCITE-377] UnregisteredDriver should catch, log and re-throw NoClassDefFoundError
  • Inherit maven-release-plugin from Apache POM.
  • Test case for [CALCITE-373] NOT IN and NULL values
  • [CALCITE-372] Change LoptOptimizeJoinRule & PushFilterPast* rules to use factory
  • Upgrade maven-checkstyle-plugin.
  • Add class Holder, a mutable slot that can contain one object.
  • Remove the 2-minute wait at the top of the hour for tests of CURRENT_TIME, etc.
  • Tune ImmutableIntList's iterators.
  • [CALCITE-364] Validator rejects valid WITH ... ORDER BY query
  • [CALCITE-363] Use dependencyManagement and pluginManagement in POM files
  • Add FilterFactory.
  • Add README file, incubation disclaimers, and how-to build and running tests.
  • Add KEYS and start how-to for making snapshots and releases.
  • Capital case component names; inherit license info from Apache parent POM.
  • Only run apache-rat and git-commit-id-plugin in “release” maven profile.
  • [CALCITE-348] Add Apache RAT as maven plugin
  • Change license headers from “Julian Hyde” to “ASF”; add headers where missing.
  • Fix build breakage on JDK 1.6 due to missing method BitSet.previousClearBit.
  • Refactor test infrastructure to allow testing against heuristic bushy-join optimizer.
  • Add methods and tests for BitSets, and re-organize tests.
  • [CALCITE-354] Change maven groupId to “org.apache.optiq”
  • Specify return type when calling RexBuilder.makeCall, if possible.
  • Eliminate duplicate conditions in RexProgramBuilder.addCondition, not RexBuilder.makeCall as previously.
  • [CALCITE-345] AssertionError in RexToLixTranslator comparing to date literal
  • Restore PushFilterPastJoinRule to RelDecorrelator; interim pending [CALCITE-343] fix.
  • [CALCITE-340] Fix bug in SqlToRelConverter when push expressions in join conditions into ProjectRel.
  • [CALCITE-313] Query decorrelation fails
  • While unifying a RelNode tree with a materialized view expression, switch representation to MutableRels.
  • [CALCITE-305] Unit test failure on release candidates
  • [CALCITE-325] Use Java list instead of Guava list to avoid null checks in case of SqlTypeExplicitPrecedenceList.
  • [CALCITE-326] Fix RelOptUtil ANY type check.
  • [CALCITE-303] Migrate issue URLs
  • [CALCITE-331] Precision/scale compatibility checks should always succeed for ANY type
  • In SqlRun, allow !plan after !ok for same SQL statement.
  • [CALCITE-318] Add unit test for SqlRun
  • Fix a bug where composite SELECT DISTINCT would return duplicate rows.

0.8 / 2014-06-27

New features

  • [CALCITE-310] Implement LEAD, LAG and NTILE windowed aggregates
  • Reduce COUNT(not-null-expression) to COUNT()
  • [CALCITE-292] Improve windowed aggregate return types
  • [CALCITE-302] Use heuristic rule to plan queries with large numbers of joins
  • [CALCITE-283] Add TPC-DS data generator
  • [CALCITE-294] Implement DENSE_RANK windowed aggregate function
  • SqlRun utility
    • [CALCITE-290] Add SqlRun, an idempotent utility for running SQL test scripts
    • Add “!skip” command to SqlRun.
    • Add MySQL formatting mode to SqlRun.

API changes

  • Re-organize planner initialization, to make it easier to use heuristic join order.
  • [CALCITE-301] Add Program interface, a planner phase more general than current RuleSet
  • [CALCITE-263] Add operand type that will cause a rule to fire when a new subset is created
  • Clean up and document SqlKind.
    • Add IS_NOT_TRUE and IS_NOT_FALSE SqlKind enums.
    • Add SqlKind.IS_NOT_NULL enum value, and use where possible, including for IS_NOT_UNKNOWN operator.

Bug-fixes and internal changes

  • [CALCITE-312] Trim non-required fields before WindowRel
  • [CALCITE-311] Wrong results when filtering the results of windowed aggregation
  • More tests for WITH ... ORDER BY
  • [CALCITE-309] WITH ... ORDER BY query gives AssertionError
  • Enable MultiJoinRel and some other planner rule tests.
  • Add ImmutableNullableList and UnmodifiableArrayList, and remove calls to Arrays.asList.
  • Add method IntPair.zip.
  • Reimplement regular and windowed aggregates
  • Switch from github to Apache JIRA for issues tracking.
    • In release history, update issue URLs from github to Apache JIRA
  • The Apache mailing list is now the official mailing list. Add presentations.
  • Add test for overloaded UDF.
  • Add tests for NOT IN where sub-query returns NULL values.
  • [CALCITE-288] Add tests for windowed aggregation based on Postgres reference queries
  • [CALCITE-286] Error casting MongoDB date
  • [CALCITE-284] Window functions range defaults to CURRENT ROW
  • [<a href=https://issues.apache.org/jira/browse/CALCITE-285">CALCITE-285] Window functions throw exception without ORDER BY
  • Test case for [CALCITE-285].
  • [CALCITE-281] EXTRACT function's SQL return type is BIGINT but implemented as Java int

0.7 / 2014-05-13

New features

  • Implement table functions.
  • Arrays and multi-sets:
    • [CALCITE-267] Improve support for ARRAY data type
    • Better type information for JDBC Array; nested array now possible.
    • Implement JOIN LATERAL and JOIN UNNEST.
    • Implement the UNNEST relational operator, and various improvements to ARRAY and MULTISET data types.
    • Represent ARRAY columns as Java lists.
    • Implement CARDINALITY(ARRAY) SQL operator.
  • Implement scalar sub-query in SELECT clause.
  • [CALCITE-273] Support column alias in WITH queries (common table expressions)
  • Windowed aggregates:
    • Aggregate over constants, e.g. SUM(1) OVER (ROWS 10 PRECEDING);
    • UNBOUNDED PRECEDING window range;
    • Windowed aggregates computed over primitive scalars.
  • Fix return type inference for aggregate calls. If the GROUP BY clause is empty, SUM may return null.
  • [CALCITE-37] Document JSON model file format (as MODEL.md).
  • [CALCITE-238] Add adapter that generates TPC-H data
  • Improve exception message in AvaticaConnection; add ExceptionMessageTest.
  • Implement micro-benchmarks via JMH.

API changes

  • Provide an option to create root schema without the “metadata” schema.
  • Schema SPI:
    • [CALCITE-175] Modify Schema SPI to allow caching
    • Get sub-schemas defined by a Schema SPI, and cache their OptiqSchema wrappers. (Tobi Vollebregt and Julian Hyde)
  • SqlAdvisor callable from client via JDBC.

Bug-fixes and internal changes

  • Add Apache incubator proposal.
  • Rename RELEASE.md to HISTORY.md.
  • Upgrade maven-release-plugin.
  • Upgrade to linq4j-0.3.
  • Code generation improvements:
  • Move code-generation optimizer to linq4j;
  • Improve translation of strict functions;
  • Mark most methods in SqlFunctions as @Deterministic;
  • Support static final constants generated by linq4j.
  • Avoid excessive box and unbox of primitives when using Object[] storage.
  • In JDBC result set, avoid row computation on each accessor call.
  • Test composite join conditions in various flavors of outer join.
  • Use fromTrait of the just previously converted RelNode instead of the original RelNode.
  • Disable a MongoDB test, pending [CALCITE-270].
  • Hush warnings from SplunkAdapterTest if Splunk is not available.
  • [CALCITE-252] Scalar sub-query that returns 0 rows should become NULL value
  • SplunkAdapterTest now uses the same Foodmart database as JdbcTest.
  • [CALCITE-242] SplunkAdapterTest fails
  • Remove some obsolete classes.
  • [CALCITE-205] Suspicious map.get in VolcanoPlanner.reregister

0.6 / 2014-04-11

New features

  • [CALCITE-214] Modify Frameworks to allow Schema to be re-used Obsoletes name field of ReflectiveSchema.
  • [CALCITE-237] Allow user-defined aggregate functions (UDAs) to be defined in a model
  • [CALCITE-227] Extend EXTRACT function to support DATE, TIME and TIMESTAMP values
  • [CALCITE-222] User-defined table macros
  • [CALCITE-179] Optiq on Windows
    • Add sqlline.bat and fix issues running sqlline under Cygwin.
  • [CALCITE-195] Push aggregation into MongoDB adapter
  • [CALCITE-193] Implement OFFSET and LIMIT in MongoDB adapter
  • [CALCITE-164] Improve query performance of optiq over MongoDB
  • Add Phoenix (HBase) SQL dialect (Bruno Dumon)

API changes

  • Obsolete RexImpTable.AggregateImplementor and rename AggImplementor2. (This is a breaking change.)
  • Convert CombinedParser.jj into freemarker template to allow custom parser implementations. (Venki Korukanti)
  • Extend Planner to pass a custom ConvertletTable and custom SQL parser.
  • In Frameworks, add a way to specify list of TraitDefs that will be used by planner. (Jinfeng Ni)
  • [CALCITE-198] Use RexExecutor to evaluate projections and filters
  • [CALCITE-219] Parse ALTER scope SET option = value statement
  • [CALCITE-215] A Schema should not have to remember its name and parent (This is a breaking change.)
  • [CALCITE-180] Common base class for TableFunction, ScalarFunction (This is a breaking change.)
  • Add methods for dealing with symbols; deprecate SqlLiteral.booleanValue(SqlNode), SqlLiteral.symbolValue(SqlNode).
  • Add RelOptPlanner.clear(); now it is safe to call transform twice. (Jinfeng Ni)
  • Remove APIs deprecated for 0.5.
  • Move around some operator classes and singletons.

Bug fixes and internal changes

  • Upgrade to linq4j-0.2.
  • FETCH and LIMIT are ignored during SQL-to-RelNode translation. (Venki Korukanti)
  • [CALCITE-245] Off-by-one translation of ON clause of JOIN
  • [CALCITE-191] Rotate time/date/timestamp vals to local timezone
  • [CALCITE-244] RelOptTableImpl.create always expects QueryableTable type in OptiqSchema.TableEntry
  • [CALCITE-225] Optiq doesn't correctly decorrelate queries
  • Clean up package-info. Remove duplicates in test packages so they don't conflict with those in non-test packages.
  • Add Pair.adjacents(Iterable).
  • [CALCITE-199] Various ANY type conditions aren't correctly being considered (Jacques Nadeau)
  • Add files to .gitignore that shouldn't be checked in when using Eclipse. (Jacques Nadeau)
  • Add class ControlFlowException, and make it base class of existing control-flow exception classes.
  • [CALCITE-232] Sum and avg of empty set should be null as per SQL specification
  • Add SqlUnresolvedFunction, to improve how return type of user-defined functions is resolved. (Vladimir Sitnikov)
  • [CALCITE-228] Error while compiling generated Java code when using UDF in expression
  • [CALCITE-226] User-defined functions should work without explicit schema prefix
  • [CALCITE-229] Join between different JDBC schemas not implementable
  • [CALCITE-230] RemoveSortRule derives trait set from sort, should derive it from sort's child
  • Test view and sub-query with ORDER BY and LIMIT.
  • [CALCITE-223] Add NOTICE and LICENSE files in all generated JAR files
  • [CALCITE-209] Consistent strategy for line-endings in tests Convert uses of NL in tests to Linux newline “\n”. This makes string constants simpler.
  • [CALCITE-218] Functions case sensitive when using Lex.MYSQL
  • Add tests that a query with aggregate expressions in the SELECT clause is considered an aggregate query, even if there is no GROUP BY.
  • [CALCITE-216] Inconsistent use of provided operator table causes inability to add aggregate functions
  • [CALCITE-200] Javadoc generation fails under JDK 1.8
  • Add class XmlOutput (based on org.eigenbase.xom.XMLOutput) and remove dependency on eigenbase-xom.
  • Performance: Don't create stack-trace for exceptions used for control-flow. (Vladimir Sitnikov)
  • Performance: Tune RexProgramBuilder by using Pair rather than String as expression key. (Vladimir Sitnikov)
  • Fix NPE using TRIM function with JDBC. (Bruno Dumon)
  • Add dependency on hydromatic-resource-maven-plugin and obsolete our copy of the resource framework.
  • Fix race condition in SpaceList.
  • In planner, use RelTrait.subsumes rather than equals in an assert. (Jinfeng Ni)

0.5 / 2014-03-14

New features

  • Allow quoting, quotedCasing, unquotedCasing, and caseSensitive properties to be specified explicitly (Vladimir Sitnikov)
  • Recognize more kinds of materializations, including filter-on-project (where project contains expressions) and some kinds of aggregation.
  • [CALCITE-128] Support WITH queries (common table expressions)
  • [CALCITE-53] Allow WHEN clause in simple CASE expression to have multiple values
  • [CALCITE-156] Optiq should recognize ‘SYSTEM TABLE’, ‘JOIN’, ‘INDEX’ as table types
  • Support querying ARRAY columns from JDBC source. (Gabriel Reid)

API changes

  • Add ProjectRelBase.copy(RelTraitSet, RelNode, List&lt;RexNode&gt;, RelDataType) and make ProjectRelBase.copy(RelTraitSet, RelNode) final. (This is a breaking change for sub-classes of ProjectRelBase.)
  • Change RexBuilder.makeRangeReference parameter type.
  • RexBuilder.makeInputRef replaces RelOptUtil.createInputRef.
  • [CALCITE-160] Allow comments in schema definitions
  • [CALCITE-147] Create a new kind of SqlCall that keeps operands in fields, not an operands array
    • Very widely used parse tree nodes with complex operands, including SqlSelect, SqlJoin, SqlInsert, and a new node type SqlOrderBy, are now sub-classes of SqlCall but not SqlBasicCall.
    • (This is a breaking change to code that assumes that, say, SqlSelect has an operands field.)
  • Convert all enum constants to upper-case. (This is a breaking change.)

Bug-fixes and internal changes

  • Generate optiq-core-VERSION-tests.jar not parent-VERSION-tests.jar.
  • [CALCITE-176] ORDER BY expression doesn't work with SELECT *
  • Fix VARCHAR casts sent to hsqldb source (Bruno Dumon)
  • [CALCITE-143] Remove dependency on eigenbase-resgen
  • [CALCITE-173] Case-insensitive table names are not supported for Casing.UNCHANGED
  • DATE.getLimit now returns Calendar in GMT time zone (Vladimir Sitnikov)
  • Set en_US locale in tests that match against error numbers, dates (Vladimir Sitnikov)
  • Use 1 test thread per CPU to avoid thread starvation on dual core CPUs (Vladimir Sitnikov)
  • [CALCITE-174] Move hsqldb to test scope
  • Add unit tests for RexExecutorImpl.
  • Correct JSON model examples in Javadoc comments. (Karel Vervaeke)
  • Move test reference logs from src/test/java to src/test/resources (reduces the number of ‘untracked files’ reported by git)
  • Tune Util.SpaceList, fix race condition, and move into new utility class Spaces.
  • [CALCITE-163] Equi-join warning
  • [CALCITE-157] Handle SQLFeatureNotSupported when calling setQueryTimeout (Karel Vervaeke)
  • Fix Optiq on Windows. (All tests and checkstyle checks pass.)
  • In checkstyle, support Windows-style file separator, otherwise build fails in Windows due to suppressions not used. (Vladimir Sitnikov)
  • Enable MongoDB tests when -Dcalcite.test.mongodb=true.
  • Cleanup cache exception-handling and an assert.
  • [CALCITE-153] Error using MongoDB adapter: Failed to set setXIncludeAware(true)
  • Disable spark engine unless Spark libraries are on the class path and spark=true is specified in the connect string.
  • Fix path to mongo-zips-model.json in HOWTO. (Mariano Luna)
  • Fix bug deriving the type of a join-key.
  • Fix the value of ONE_MINUS_EPSILON.
  • [CALCITE-158] Optiq fails when call Planner.transform() multiple times, each with different ruleset
  • [CALCITE-148] Less verbose description of collation. Also, optimize RelTraitSet creation and amortize RelTraitSet.toString().
  • Add generics to SQL parser.
  • [CALCITE-145] Unexpected upper-casing of keywords when using java lexer
  • Remove duplicate maven-source-plugin.
  • [CALCITE-141] Downgrade to guava-11.0.2. (This is necessary for Hadoop compatibility. Later versions of Guava can also be used.)
  • Upgrade to spark-0.9.0. (Because this version of spark is available from maven-central, we can make optiq-spark part of the regular build, and remove the spark profile.)

0.4.18 / 2014-02-14

API and functionality changes

  • Configurable lexical policy
    • [CALCITE-33] SQL parser should allow different identifier quoting
    • [CALCITE-34] Policy for case-sensitivity of identifiers should be configurable
    • New connect-string parameter “lex”, with allowable values “ORACLE”, “MYSQL”, “SQL_SERVER”, “JAVA” sets policy to be like those databases, in terms of quote string, whether quoted and unquoted identifiers are converted to upper/lower case, and whether identifiers are matched case-sensitively. “JAVA” is case-sensitive, even for unquoted identifiers. It should be possible for each connection to have its own settings for these. Objects shared between sessions (views, materialized views) might require more work.
    • Added various internals to make it easy for developers to do the right thing. When you need to look up a schema, table or column/field name, you should use a catalog reader, and it will apply the right case-sensitivity policy.
    • Enable optiq consumer to utilize different lexical settings in Frameworks/Planner. (Jacques Nadeau)
  • [CALCITE-115] Add a PARSE_TREE hook point with SqlNode parameter
  • Change planner rules to use ProjectFactory for creating projects. (John Pullokkaran)
  • [CALCITE-131] Add interfaces for metadata (statistics) (This is a breaking change.)
  • Update Avatica to allow Cursor & Accessor implementations to throw SQLException. (Jacques Nadeau)
  • Separate cost model (RelOptCostFactory) from planner. Allow VolcanoPlanner to be sub-classed with different cost factory.
    • Remove references to VolcanoCost from RelSubset, so clients can use a different RelOptCost. (Harish Butani)
    • Make VolcanoCost immutable.
  • Break SqlTypeStrategies into OperandTypes, ReturnTypes and InferTypes, and rename its static members to upper-case, per checkstyle. (This is a breaking change.)
  • Add a mechanism for defining configuration parameters and have them appear in the responses to AvaticaDatabaseMetaData methods.
  • [CALCITE-113] User-defined scalar functions
  • Add rules to short-cut a query if LIMIT 0 is present. Also remove sort, aggregation, join if their inputs are known to be empty, and propagate the fact that the relational expressions are known to be empty up the tree. (We already do this for union, filter, project.)
  • RexNode and its sub-classes are now immutable.

Bug fixes and internal changes

  • [CALCITE-16] Upgrade to janino-2.7
  • Upgrade to guava-15.0 (guava-14.0.1 still allowed), sqlline-1.1.7, maven-surefire-plugin-2.16, linq4j-0.1.13.
  • [CALCITE-136] Support Hive dialect
  • [CALCITE-138] SqlDataTypeSpec.clone handles collection types wrong
  • [CALCITE-137] If a subset is created that is subsumed by an existing subset, its ‘best’ is not assigned
    • If best rel in a Volcano subset doesn't have metadata, see if other rels have metadata.
  • [CALCITE-127] EnumerableCalcRel can't support 3+ AND conditions (Harish Butani)
  • Fix push-down of datetime literals to JDBC data sources.
  • Add Util.startsWith(List, List) and Util.hashCode(double).
  • Add maven-checkstyle-plugin, enable in “verify” phase, and fix exceptions.
  • Fix SqlValidator to rely on RelDataType to do field name matching. Fix RelDataTypeImpl to correctly use the case sensitive flag rather than ignoring it.
  • [CALCITE-119] Comparing Java type long with SQL type INTEGER gives wrong answer
  • Enable multi-threaded testing, and fix race conditions.
    • Two of the race conditions involved involving trait caches. The other was indeterminacy in type system when precision was not specified but had a default; now we canonize TIME to TIME(0), for instance.
  • Convert files to us-ascii.
  • Work around [JANINO-169].
  • Refactor SQL validator testing infrastructure so SQL parser is configurable.
  • Add optiq-mat-plugin to README.
  • Fix the check for duplicate subsets in a rule match.
  • [CALCITE-112] Java boolean column should be treated as SQL boolean
  • Fix escaped unicode characters above 0x8000. Add tests for unicode strings.

0.4.17 / 2014-01-13

API changes

  • [CALCITE-106] Make Schema and Table SPIs simpler to implement, and make them re-usable across connections (This is a breaking change.)
  • Make it easier to define sub-classes of rule operands. The new class RelOptRuleOperandChildren contains the children of an operand and the policy for dealing with them. Existing rules now use the new methods to construct operands: operand(), leaf(), any(), none(), unordered(). The previous methods are now deprecated and will be removed before 0.4.18. (This is a breaking change.)
  • [CALCITE-101] Enable phased access to the Optiq engine
  • List-handling methods in Util: add methods skipLast, last, skip; remove subList, butLast.
  • Convert SqlIdentifier.names from String[] to ImmutableList<String>.
  • Rename OptiqAssert.assertThat() to that(), to avoid clash with junit's Assert.assertThat().
  • Usability improvements for RelDataTypeFactory.FieldInfoBuilder. It now has a type-factory, so you can just call build().
  • Rework HepProgramBuilder into a fluent API.
  • [CALCITE-105] Externalize RelNode to and from JSON

Tuning

  • If EnumerableAggregateRel has no aggregate functions, generate a call to Enumerable.distinct(), thereby saving the effort of building trivial accumulators.
  • Default rule set now does not introduce CalcRel until a later phase of planning. This reduces the number of trivial projects and calcs created, merged, and elimated.
  • Reduce the amount of time spent creating record types that already exist.
  • More efficient implementation of Util.isDistinct for small lists.
  • When an internal record has 0 fields, rather than generating a synthetic class and lots of instances that are all the same, use the new Unit class, which is a singleton.
  • To take advantage of asymmetric hash join added recently in linq4j, tweak cost of EnumerableJoinRel so that join is cheaper if the larger input is on the left, and more expensive if it is a cartesian product.
  • [CALCITE-70] Joins seem to be very expensive in memory
  • Make planning process more efficient by not sorting the list of matched rules each cycle. It is sorted if tracing is enabled; otherwise we scan to find the most important element. For this list, replace LinkedList with ChunkList, which has an O(1) remove and add, a fast O(n) get, and fast scan.

Other

  • [CALCITE-87] Constant folding
    • Rules for constant-expression reduction, and to simplify/eliminate VALUES operator.
  • Graph algorithms: Implement breadth-first iterator and cycle-detector.
  • Fix bug in planner which occurred when two RelNodes have identical digest but different row-type.
  • Fix link to optiq-csv tutorial.
  • Fix bugs in RemoveTrivialProjectRule.strip, JdbcProjectRel.implement and SortRel.computeSelfCost.
  • Reformat code, and remove @author tags.
  • Upgrade to eigenbase-xom-1.3.4, eigenbase-properties-1.1.4, eigenbase-resgen-1.3.6.
  • Upgrade to linq4j-0.1.12.
  • [CALCITE-97] Correlated EXISTS
  • Fix a bug in VolcanoCost.
  • Add class FoodMartQuerySet, that contains the 6,700 foodmart queries.
  • Fix factory class names in UnregisteredDriver
  • [CALCITE-96] LIMIT against a table in a clone schema causes UnsupportedOperationException
  • Disable spark module by default.
  • Allow CloneSchema to be specified in terms of url, driver, user, password; not just dataSource.
  • Wrap internal error in SQLException.

0.4.16 / 2013-11-24

  • [CALCITE-69] Can't join on string columns and other problems with expressions in the join condition
  • [CALCITE-74] JOIN ... USING fails in 3-way join with UnsupportedOperationException.
  • [CALCITE-65] Fix issues in the JDBC driver, and in particular to DatabaseMetaData methods, to make Squirrel-SQL run better.
  • Fix JDBC column, table, schema names for when the table is not in a schema of depth 1.
  • [CALCITE-85] Adding a table to the root schema causes breakage in OptiqPrepareImpl
  • [CALCITE-84] Extract Optiq‘s JDBC driver as a new JDBC driver framework, Avatica. Other projects can use this to implement a JDBC driver by implementing just a few methods. If you wish to use Optiq’s JDBC driver, you will now need to include optiq-avatica.jar in addition to optiq-core.jar. Avatica does not depend on anything besides the standard Java library.
  • Support for parameters in PreparedStatement.
  • First steps in recognizing complex materializations. Internally we introduce a concept called a “star table”, virtual table composed of real tables joined together via many-to-one relationships. The queries that define materializations and end-user queries are canonized in terms of star tables. Matching (not done yet) will then be a matter of looking for sort, groupBy, project. It is not yet possible to define a star in an Optiq model file.
  • Add section to HOWTO on implementing adapters.
  • Fix data type conversions when creating a clone table in memory.
  • Fix how strings are escaped in JsonBuilder.
  • Test suite now depends on an embedded hsqldb database, so you can run mvn test right after pulling from git. You can instead use a MySQL database if you specify ‘-Dcalcite.test.db=mysql’, but you need to manually populate it.
  • Fix a planner issue which occurs when the left and right children of join are the same relational expression, caused by a self-join query.
  • [CALCITE-76] Precedence of the item operator, map[index]; remove the space before ‘[’ when converting parse tree to string.
  • Allow CAST(expression AS ANY), and fix an issue with the ANY type and NULL values.
  • Handle null timestamps and dates coming out of JDBC adapter.
  • Add jdbcDriver attribute to JDBC schema in model, for drivers that do not auto-register.
  • Allow join rules to match any subclass of JoinRelBase.
  • Push projects, filters and sorts down to MongoDB. (Fixes [CALCITE-57], [CALCITE-60] and [CALCITE-72].)
  • Add instructions for loading FoodMart data set into MongoDB, and how to enable tracing.
  • Now runs on JDK 1.8 (still runs on JDK 1.6 and JDK 1.7).
  • Upgrade to junit-4.11 (avoiding the dodgy junit-4.1.12).
  • Upgrade to linq4j-0.1.11.

0.4.15 / 2013-10-14

  • Lots of good stuff that this margin is too small to contain. See SQL language reference and JSON model reference.

Linq4j release history

Linq4j-0.4 was the last independent release of linq4j. From calcite-0.9.2 onwards, the code was included as calcite-linq4j, and features added to linq4j in a particular calcite release are described with the other changes in that release.

0.4 / 2014-05-28

  • Fix #27, “Incorrectly inlines non-final variable”.
  • Maven build process now deploys web site.
  • Implement Enumerable methods: any, all, contains with EqualityComparer, first, first with predicate.

0.3 / 2014-04-21

  • Move optimizer visitor from optiq to linq4j; add ExpressionType.modifiesLvalue to avoid invalid inlining.
  • Fix #17, “Assign constant expressions to ‘static final’ members”; add @Deterministic annotation to help deduce which expressions are constant.
  • Multi-pass optimization: some of the variables might be avoided and inlined after the first pass.
  • Various other peephole optimizations: Boolean.valueOf(const), ‘not’ expressions (!const, !!a, !(a==b), !(a!=b), !(a>b), etc.), ‘?’ expressions coming from CASE (a ? booleanConstant : b and a ? b : booleanConstant).
  • Implement left, right and full outer join.
  • Clean build on cygwin/Windows.

0.2 / 2014-04-11

  • Fix #8, “Javadoc generation fails under JDK 1.8”.
  • Fix #15, “Expressions.ifThenElse does not work”.
  • Use HashMap for searching of declarations to reuse; consider both optimizing and optimize flags when reusing.
  • Implement equals and hashCode for expressions. Hash codes for complex expressions are cached into a field of the expression.
  • Add example, com.example.Linq4jExample.
  • Fix optimizing away parameter declarations in assignment target.
  • Support Windows path names in checkstyle-suppresions.
  • Support Statement.toString via ExpressionWriter.
  • Use AtomicInteger for naming of ParameterExpressions to avoid conflicts in multithreaded usage
  • Cleanup: use Functions.adapt rather than new AbstractList
  • Add NOTICE and LICENSE files in generated JAR file.
  • Optimize select() if selector is identity.
  • Enable checkstyle.

0.1.13 / 2014-01-20

  • Remove spurious “null” generated when converting expression to string.
  • Allow a field declaration to not have an initializer.
  • Add Primitive.defaultValue.
  • Enable oraclejdk8 in Travis CI.

0.1.12 / 2013-12-07

  • Add release notes.
  • Fix implementation of Enumerable.asEnumerable in DefaultQueryable (inherited by most classes that implement Queryable).

0.1.11 / 2013-11-06

  • Initial commit