From 3bec197bce73ed7aa2ae3fabf457c408aa7aff87 Mon Sep 17 00:00:00 2001 From: Igor Guzenko Date: Mon, 22 Oct 2018 14:33:49 +0300 Subject: DRILL-6862: Update Calcite to 1.18.0 1. Moved Calcite dependency from profile hadoop-default to general dependency managment 2. Updated Calcite version to 1.18.0-drill-r0 and Avatica version to 1.13.0 3. Hook.REL_BUILDER_SIMPLIFY moved to static block, cause now it can't be removed (fixes DRILL-6830) 4. Removed WrappedAccessor, since it was workaround fixed in CALCITE-1408 5. Fixed setting of multiple options in TestBuilder 6. Timstampadd type inference aligned with CALCITE-2699 7. Dependency update caused 417 kB increase of jdb-all jar size, so the maxsize limit was increased from 39.5 to 40 MB 8. Added test into TestDrillParquetReader to ensure that DRILL-6856 was fixed by Calcite update close apache/drill#1631 --- exec/java-exec/src/main/codegen/data/Parser.tdd | 763 ++++++++++++++++++++- .../apache/drill/exec/planner/DrillRelBuilder.java | 10 + .../drill/exec/planner/sql/SqlConverter.java | 15 +- .../drill/exec/planner/sql/TypeInferenceUtils.java | 6 +- .../test/java/org/apache/drill/TestCTASJson.java | 16 +- .../physical/impl/TestNestedDateTimeTimestamp.java | 12 +- .../store/parquet2/TestDrillParquetReader.java | 13 + .../java/org/apache/drill/test/TestBuilder.java | 11 +- exec/jdbc-all/pom.xml | 2 +- .../drill/jdbc/impl/AvaticaDrillSqlAccessor.java | 6 + .../apache/drill/jdbc/impl/DrillResultSetImpl.java | 12 +- .../apache/drill/jdbc/impl/WrappedAccessor.java | 447 ------------ pom.xml | 84 ++- 13 files changed, 867 insertions(+), 530 deletions(-) delete mode 100644 exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/WrappedAccessor.java diff --git a/exec/java-exec/src/main/codegen/data/Parser.tdd b/exec/java-exec/src/main/codegen/data/Parser.tdd index 9da80af2b..820ecb5b5 100644 --- a/exec/java-exec/src/main/codegen/data/Parser.tdd +++ b/exec/java-exec/src/main/codegen/data/Parser.tdd @@ -88,8 +88,767 @@ ] # List of keywords from "keywords" section that are not reserved. - nonReservedKeywords: [ - ] + # Copied from calcite-core config.fmpp + # For details please see comment under CALCITE-2405. + nonReservedKeywords: [ + "A" + "ABSOLUTE" + "ACTION" + "ADA" + "ADD" + "ADMIN" + "AFTER" + "ALWAYS" + "APPLY" + "ASC" + "ASSERTION" + "ASSIGNMENT" + "ATTRIBUTE" + "ATTRIBUTES" + "BEFORE" + "BERNOULLI" + "BREADTH" + "C" + "CASCADE" + "CATALOG" + "CATALOG_NAME" + "CENTURY" + "CHAIN" + "CHARACTER_SET_CATALOG" + "CHARACTER_SET_NAME" + "CHARACTER_SET_SCHEMA" + "CHARACTERISTICS" + "CHARACTERS" + "CLASS_ORIGIN" + "COBOL" + "COLLATION" + "COLLATION_CATALOG" + "COLLATION_NAME" + "COLLATION_SCHEMA" + "COLUMN_NAME" + "COMMAND_FUNCTION" + "COMMAND_FUNCTION_CODE" + "COMMITTED" + "CONDITION_NUMBER" + "CONNECTION" + "CONNECTION_NAME" + "CONSTRAINT_CATALOG" + "CONSTRAINT_NAME" + "CONSTRAINT_SCHEMA" + "CONSTRAINTS" + "CONSTRUCTOR" + "CONTINUE" + "CURSOR_NAME" + "DATA" + "DATABASE" + "DATETIME_INTERVAL_CODE" + "DATETIME_INTERVAL_PRECISION" + "DECADE" + "DEFAULTS" + "DEFERRABLE" + "DEFERRED" + "DEFINED" + "DEFINER" + "DEGREE" + "DEPTH" + "DERIVED" + "DESC" + "DESCRIPTION" + "DESCRIPTOR" + "DIAGNOSTICS" + "DISPATCH" + "DOMAIN" + "DOW" + "DOY" + "DYNAMIC_FUNCTION" + "DYNAMIC_FUNCTION_CODE" + "EPOCH" + "EXCEPTION" + "EXCLUDE" + "EXCLUDING" + "FINAL" + "FIRST" + "FOLLOWING" + "FORTRAN" + "FOUND" + "FRAC_SECOND" + "G" + "GENERAL" + "GENERATED" + "GEOMETRY" + "GO" + "GOTO" + "GRANTED" + "HIERARCHY" + "IMMEDIATE" + "IMMEDIATELY" + "IMPLEMENTATION" + "INCLUDING" + "INCREMENT" + "INITIALLY" + "INPUT" + "INSTANCE" + "INSTANTIABLE" + "INVOKER" + "ISODOW" + "ISOYEAR" + "ISOLATION" + "JAVA" + "JSON" + "K" + "KEY" + "KEY_MEMBER" + "KEY_TYPE" + "LABEL" + "LAST" + "LENGTH" + "LEVEL" + "LIBRARY" + "LOCATOR" + "M" + "MAP" + "MATCHED" + "MAXVALUE" + "MICROSECOND" + "MESSAGE_LENGTH" + "MESSAGE_OCTET_LENGTH" + "MESSAGE_TEXT" + "MILLISECOND" + "MILLENNIUM" + "MINVALUE" + "MORE_" + "MUMPS" + "NAME" + "NAMES" + "NANOSECOND" + "NESTING" + "NORMALIZED" + "NULLABLE" + "NULLS" + "NUMBER" + "OBJECT" + "OCTETS" + "OPTION" + "OPTIONS" + "ORDERING" + "ORDINALITY" + "OTHERS" + "OUTPUT" + "OVERRIDING" + "PAD" + "PARAMETER_MODE" + "PARAMETER_NAME" + "PARAMETER_ORDINAL_POSITION" + "PARAMETER_SPECIFIC_CATALOG" + "PARAMETER_SPECIFIC_NAME" + "PARAMETER_SPECIFIC_SCHEMA" + "PARTIAL" + "PASCAL" + "PASSTHROUGH" + "PAST" + "PATH" + "PLACING" + "PLAN" + "PLI" + "PRECEDING" + "PRESERVE" + "PRIOR" + "PRIVILEGES" + "PUBLIC" + "QUARTER" + "READ" + "RELATIVE" + "REPEATABLE" + "REPLACE" + "RESTART" + "RESTRICT" + "RETURNED_CARDINALITY" + "RETURNED_LENGTH" + "RETURNED_OCTET_LENGTH" + "RETURNED_SQLSTATE" + "ROLE" + "ROUTINE" + "ROUTINE_CATALOG" + "ROUTINE_NAME" + "ROUTINE_SCHEMA" + "ROW_COUNT" + "SCALE" + "SCHEMA" + "SCHEMA_NAME" + "SCOPE_CATALOGS" + "SCOPE_NAME" + "SCOPE_SCHEMA" + "SECTION" + "SECURITY" + "SELF" + "SEQUENCE" + "SERIALIZABLE" + "SERVER" + "SERVER_NAME" + "SESSION" + "SETS" + "SIMPLE" + "SIZE" + "SOURCE" + "SPACE" + "SPECIFIC_NAME" + "SQL_BIGINT" + "SQL_BINARY" + "SQL_BIT" + "SQL_BLOB" + "SQL_BOOLEAN" + "SQL_CHAR" + "SQL_CLOB" + "SQL_DATE" + "SQL_DECIMAL" + "SQL_DOUBLE" + "SQL_FLOAT" + "SQL_INTEGER" + "SQL_INTERVAL_DAY" + "SQL_INTERVAL_DAY_TO_HOUR" + "SQL_INTERVAL_DAY_TO_MINUTE" + "SQL_INTERVAL_DAY_TO_SECOND" + "SQL_INTERVAL_HOUR" + "SQL_INTERVAL_HOUR_TO_MINUTE" + "SQL_INTERVAL_HOUR_TO_SECOND" + "SQL_INTERVAL_MINUTE" + "SQL_INTERVAL_MINUTE_TO_SECOND" + "SQL_INTERVAL_MONTH" + "SQL_INTERVAL_SECOND" + "SQL_INTERVAL_YEAR" + "SQL_INTERVAL_YEAR_TO_MONTH" + "SQL_LONGVARBINARY" + "SQL_LONGVARNCHAR" + "SQL_LONGVARCHAR" + "SQL_NCHAR" + "SQL_NCLOB" + "SQL_NUMERIC" + "SQL_NVARCHAR" + "SQL_REAL" + "SQL_SMALLINT" + "SQL_TIME" + "SQL_TIMESTAMP" + "SQL_TINYINT" + "SQL_TSI_DAY" + "SQL_TSI_FRAC_SECOND" + "SQL_TSI_HOUR" + "SQL_TSI_MICROSECOND" + "SQL_TSI_MINUTE" + "SQL_TSI_MONTH" + "SQL_TSI_QUARTER" + "SQL_TSI_SECOND" + "SQL_TSI_WEEK" + "SQL_TSI_YEAR" + "SQL_VARBINARY" + "SQL_VARCHAR" + "STATE" + "STATEMENT" + "STRUCTURE" + "STYLE" + "SUBCLASS_ORIGIN" + "SUBSTITUTE" + "TABLE_NAME" + "TEMPORARY" + "TIES" + "TIMESTAMPADD" + "TIMESTAMPDIFF" + "TOP_LEVEL_COUNT" + "TRANSACTION" + "TRANSACTIONS_ACTIVE" + "TRANSACTIONS_COMMITTED" + "TRANSACTIONS_ROLLED_BACK" + "TRANSFORM" + "TRANSFORMS" + "TRIGGER_CATALOG" + "TRIGGER_NAME" + "TRIGGER_SCHEMA" + "TYPE" + "UNBOUNDED" + "UNCOMMITTED" + "UNDER" + "UNNAMED" + "USAGE" + "USER_DEFINED_TYPE_CATALOG" + "USER_DEFINED_TYPE_CODE" + "USER_DEFINED_TYPE_NAME" + "USER_DEFINED_TYPE_SCHEMA" + "VERSION" + "VIEW" + "WEEK" + "WRAPPER" + "WORK" + "WRITE" + "XML" + "ZONE" + + # The following keywords are reserved in core Calcite, + # are reserved in some version of SQL, + # but are not reserved in Babel. + # + # Words that are commented out (e.g. "AND") are still reserved. + # These are the most important reserved words, and SQL cannot be + # unambiguously parsed if they are not reserved. For example, if + # "INNER" is not reserved then in the query + # + # select * from emp inner join dept using (deptno)" + # + # "inner" could be a table alias for "emp". + # + "ABS", + "ABSOLUTE", + "ACTION", + "ADD", + "AFTER", + "ALL", + "ALLOCATE", + "ALLOW", + "ALTER", + "AND", +# "ANY", + "ARE", + "ARRAY", +# # "ARRAY_AGG", # not a keyword in Calcite + "ARRAY_MAX_CARDINALITY", + "AS", + "ASC", + "ASENSITIVE", + "ASSERTION", + "ASYMMETRIC", + "AT", + "ATOMIC", + "AUTHORIZATION", + "AVG", + "BEFORE", + "BEGIN", + "BEGIN_FRAME", + "BEGIN_PARTITION", + "BETWEEN", + "BIGINT", + "BINARY", + "BIT", +# # "BIT_LENGTH", # not a keyword in Calcite + "BLOB", + "BOOLEAN", + "BOTH", + "BREADTH", + "BY", +# "CALL", + "CALLED", + "CARDINALITY", + "CASCADE", + "CASCADED", +# "CASE", + "CAST", + "CATALOG", + "CEIL", + "CEILING", + "CHAR", + "CHARACTER", + "CHARACTER_LENGTH", + "CHAR_LENGTH", + "CHECK", + "CLASSIFIER", + "CLOB", + "CLOSE", + "COALESCE", + "COLLATE", + "COLLATION", + "COLLECT", + "COLUMN", + "COMMIT", + "CONDITION", + "CONNECT", + "CONNECTION", + "CONSTRAINT", + "CONSTRAINTS", + "CONSTRUCTOR", + "CONTAINS", + "CONTINUE", + "CONVERT", + "CORR", + "CORRESPONDING", + "COUNT", + "COVAR_POP", + "COVAR_SAMP", +# "CREATE", +# "CROSS", + "CUBE", + "CUME_DIST", +# "CURRENT", + "CURRENT_CATALOG", + "CURRENT_DATE", + "CURRENT_DEFAULT_TRANSFORM_GROUP", + "CURRENT_PATH", + "CURRENT_ROLE", + "CURRENT_ROW", + "CURRENT_SCHEMA", + "CURRENT_TIME", + "CURRENT_TIMESTAMP", + "CURRENT_TRANSFORM_GROUP_FOR_TYPE", + "CURRENT_USER", +# "CURSOR", + "CYCLE", + "DATA", +# "DATE", + "DAY", +# # "DAYS", # not a keyword in Calcite + "DEALLOCATE", + "DEC", + "DECIMAL", + "DECLARE", +# # "DEFAULT", + "DEFERRABLE", + "DEFERRED", +# "DEFINE", +# "DELETE", + "DENSE_RANK", + "DEPTH", + "DEREF", + "DESC", +# "DESCRIBE", # must be reserved + "DESCRIPTOR", + "DETERMINISTIC", + "DIAGNOSTICS", + "DISALLOW", + "DISCONNECT", +# "DISTINCT", +# # "DO", # not a keyword in Calcite + "DOMAIN", + "DOUBLE", +# "DROP", # probably must be reserved + "DYNAMIC", + "EACH", + "ELEMENT", + "ELSE", +# # "ELSEIF", # not a keyword in Calcite + "EMPTY", + "END", +# # "END-EXEC", # not a keyword in Calcite, and contains '-' + "END_FRAME", + "END_PARTITION", + "EQUALS", + "ESCAPE", + "EVERY", +# "EXCEPT", # must be reserved + "EXCEPTION", + "EXEC", + "EXECUTE", + "EXISTS", +# # "EXIT", # not a keyword in Calcite + "EXP", +# "EXPLAIN", # must be reserved + "EXTEND", + "EXTERNAL", + "EXTRACT", + "FALSE", +# "FETCH", + "FILTER", + "FIRST", + "FIRST_VALUE", + "FLOAT", + "FLOOR", + "FOR", + "FOREIGN", +# # "FOREVER", # not a keyword in Calcite + "FOUND", + "FRAME_ROW", + "FREE", +# "FROM", # must be reserved +# "FULL", # must be reserved + "FUNCTION", + "FUSION", + "GENERAL", + "GET", + "GLOBAL", + "GO", + "GOTO", +# "GRANT", +# "GROUP", +# "GROUPING", + "GROUPS", +# # "HANDLER", # not a keyword in Calcite +# "HAVING", + "HOLD", + "HOUR", +# # "HOURS", # not a keyword in Calcite + "IDENTITY", +# # "IF", # not a keyword in Calcite + "IMMEDIATE", + "IMMEDIATELY", + "IMPORT", +# "IN", + "INDICATOR", + "INITIAL", + "INITIALLY", +# "INNER", + "INOUT", + "INPUT", + "INSENSITIVE", +# "INSERT", + "INT", + "INTEGER", +# "INTERSECT", + "INTERSECTION", +# "INTERVAL", +# "INTO", + "IS", + "ISOLATION", +# # "ITERATE", # not a keyword in Calcite +# "JOIN", +# # "KEEP", # not a keyword in Calcite + "KEY", + "LAG", + "LANGUAGE", + "LARGE", + "LAST", + "LAST_VALUE", +# "LATERAL", + "LEAD", + "LEADING", +# # "LEAVE", # not a keyword in Calcite +# "LEFT", + "LEVEL", + "LIKE", + "LIKE_REGEX", +# "LIMIT", + "LN", + "LOCAL", + "LOCALTIME", + "LOCALTIMESTAMP", + "LOCATOR", +# # "LOOP", # not a keyword in Calcite + "LOWER", + "MAP", + "MATCH", + "MATCHES", + "MATCH_NUMBER", +# "MATCH_RECOGNIZE", + "MAX", +# # "MAX_CARDINALITY", # not a keyword in Calcite + "MEASURES", + "MEMBER", +# "MERGE", + "METHOD", + "MIN", +# "MINUS", + "MINUTE", +# # "MINUTES", # not a keyword in Calcite + "MOD", + "MODIFIES", + "MODULE", + "MONTH", + "MULTISET", + "NAMES", + "NATIONAL", +# "NATURAL", + "NCHAR", + "NCLOB", +# "NEW", +# "NEXT", + "NO", + "NONE", + "NORMALIZE", + "NOT", + "NTH_VALUE", + "NTILE", +# "NULL", + "NULLIF", + "NUMERIC", + "OBJECT", + "OCCURRENCES_REGEX", + "OCTET_LENGTH", + "OF", +# "OFFSET", + "OLD", + "OMIT", +# "ON", + "ONE", + "ONLY", + "OPEN", + "OPTION", + "OR", +# "ORDER", + "ORDINALITY", + "OUT", +# "OUTER", + "OUTPUT", +# "OVER", + "OVERLAPS", + "OVERLAY", + "PAD", + "PARAMETER", + "PARTIAL", +# "PARTITION", + "PATH", +# "PATTERN", + "PER", + "PERCENT", + "PERCENTILE_CONT", + "PERCENTILE_DISC", + "PERCENT_RANK", + "PERIOD", + "PERMUTE", + "PORTION", + "POSITION", + "POSITION_REGEX", + "POWER", + "PRECEDES", + "PRECISION", + "PREPARE", + "PRESERVE", + "PREV", + "PRIMARY", + "PRIOR", + "PRIVILEGES", + "PROCEDURE", + "PUBLIC", +# "RANGE", + "RANK", + "READ", + "READS", + "REAL", + "RECURSIVE", + "REF", + "REFERENCES", + "REFERENCING", + "REGR_AVGX", + "REGR_AVGY", + "REGR_COUNT", + "REGR_INTERCEPT", + "REGR_R2", + "REGR_SLOPE", + "REGR_SXX", + "REGR_SXY", + "REGR_SYY", + "RELATIVE", + "RELEASE", +# # "REPEAT", # not a keyword in Calcite + "RESET", +# # "RESIGNAL", # not a keyword in Calcite + "RESTRICT", + "RESULT", + "RETURN", + "RETURNS", + "REVOKE", +# "RIGHT", + "ROLE", + "ROLLBACK", +# "ROLLUP", + "ROUTINE", +# "ROW", +# "ROWS", + "ROW_NUMBER", + "RUNNING", + "SAVEPOINT", + "SCHEMA", + "SCOPE", + "SCROLL", + "SEARCH", + "SECOND", +# # "SECONDS", # not a keyword in Calcite + "SECTION", + "SEEK", +# "SELECT", + "SENSITIVE", + "SESSION", + "SESSION_USER", +# "SET", +# "SETS", + "SHOW", +# # "SIGNAL", # not a keyword in Calcite + "SIMILAR", + "SIZE", +# # "SKIP", # messes with JavaCC's token + "SMALLINT", +# "SOME", + "SPACE", + "SPECIFIC", + "SPECIFICTYPE", + "SQL", +# # "SQLCODE", # not a keyword in Calcite +# # "SQLERROR", # not a keyword in Calcite + "SQLEXCEPTION", + "SQLSTATE", + "SQLWARNING", + "SQRT", + "START", + "STATE", + "STATIC", + "STDDEV_POP", + "STDDEV_SAMP", +# "STREAM", + "SUBMULTISET", + "SUBSET", + "SUBSTRING", + "SUBSTRING_REGEX", + "SUCCEEDS", + "SUM", + "SYMMETRIC", + "SYSTEM", + "SYSTEM_TIME", + "SYSTEM_USER", +# "TABLE", +# "TABLESAMPLE", + "TEMPORARY", +# "THEN", +# "TIME", +# "TIMESTAMP", + "TIMEZONE_HOUR", + "TIMEZONE_MINUTE", + "TINYINT", + "TO", + "TRAILING", + "TRANSACTION", + "TRANSLATE", + "TRANSLATE_REGEX", + "TRANSLATION", + "TREAT", + "TRIGGER", + "TRIM", + "TRIM_ARRAY", + "TRUE", + "TRUNCATE", + "UESCAPE", + "UNDER", +# # "UNDO", # not a keyword in Calcite +# "UNION", + "UNIQUE", + "UNKNOWN", +# "UNNEST", +# # "UNTIL", # not a keyword in Calcite +# "UPDATE", + "UPPER", + "UPSERT", + "USAGE", + "USER", +# "USING", + "VALUE", +# "VALUES", + "VALUE_OF", + "VARBINARY", + "VARCHAR", + "VARYING", + "VAR_POP", + "VAR_SAMP", + "VERSION", + "VERSIONING", +# # "VERSIONS", # not a keyword in Calcite + "VIEW", +# "WHEN", + "WHENEVER", +# "WHERE", +# # "WHILE", # not a keyword in Calcite + "WIDTH_BUCKET", +# "WINDOW", +# "WITH", + "WITHIN", + "WITHOUT", + "WORK", + "WRITE", + "YEAR", + # "YEARS", # not a keyword in Calcite + "ZONE", + ] # List of additional join types. Each is a method with no arguments. # Example: LeftSemiJoin() diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/DrillRelBuilder.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/DrillRelBuilder.java index 1ec300daf..22597dc51 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/DrillRelBuilder.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/DrillRelBuilder.java @@ -67,4 +67,14 @@ public class DrillRelBuilder extends RelBuilder { public static RelBuilderFactory proto(Object... factories) { return proto(Contexts.of(factories)); } + + /** + * Disables combining of consecutive {@link org.apache.calcite.rel.core.Project} nodes. + * See comments under CALCITE-2470 for details. + * @return false + */ + @Override + protected boolean shouldMergeProject() { + return false; + } } diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java index 154bf8cbb..62d6f325d 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/SqlConverter.java @@ -119,6 +119,14 @@ public class SqlConverter { private VolcanoPlanner planner; private boolean useRootSchema = false; + static { + /* + * Sets value to false to avoid simplifying project expressions + * during creating new projects since it may cause changing data mode + * which causes to assertion errors during type validation + */ + Hook.REL_BUILDER_SIMPLIFY.add(Hook.propertyJ(false)); + } public SqlConverter(QueryContext context) { this.settings = context.getPlannerSettings(); @@ -373,13 +381,6 @@ public class SqlConverter { new SqlToRelConverter(new Expander(), validator, catalog, cluster, DrillConvertletTable.INSTANCE, sqlToRelConverterConfig); - /* - * Sets value to false to avoid simplifying project expressions - * during creating new projects since it may cause changing data mode - * which causes to assertion errors during type validation - */ - Hook.REL_BUILDER_SIMPLIFY.add(Hook.propertyJ(false)); - //To avoid unexpected column errors set a value of top to false final RelRoot rel = sqlToRelConverter.convertQuery(validatedNode, false, false); return rel.withRel(sqlToRelConverter.flattenTypes(rel.rel, true)); diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/TypeInferenceUtils.java b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/TypeInferenceUtils.java index 3319104dc..9b0142405 100644 --- a/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/TypeInferenceUtils.java +++ b/exec/java-exec/src/main/java/org/apache/drill/exec/planner/sql/TypeInferenceUtils.java @@ -593,7 +593,11 @@ public class TypeInferenceUtils { case SECOND: case MINUTE: case HOUR: - sqlTypeName = SqlTypeName.TIMESTAMP; + if (inputTypeName == SqlTypeName.TIME) { + sqlTypeName = SqlTypeName.TIME; + } else { + sqlTypeName = SqlTypeName.TIMESTAMP; + } break; default: sqlTypeName = SqlTypeName.ANY; diff --git a/exec/java-exec/src/test/java/org/apache/drill/TestCTASJson.java b/exec/java-exec/src/test/java/org/apache/drill/TestCTASJson.java index 332de099d..bbcd00b0a 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/TestCTASJson.java +++ b/exec/java-exec/src/test/java/org/apache/drill/TestCTASJson.java @@ -39,13 +39,13 @@ public class TestCTASJson extends PlanTestBase { .sqlQuery(query) .ordered() .jsonBaselineFile("json/" + testName + ".json") - .optionSettingQueriesForTestQuery("alter session set store.format = 'json' ") + .optionSettingQueriesForTestQuery("alter session set `store.format` = 'json' ") .optionSettingQueriesForTestQuery("alter session set store.json.writer.skip_null_fields = true") // DEFAULT .build() .run(); } finally { test("drop table " + testName + "_json"); - test("alter session reset store.format "); + test("alter session reset `store.format` "); test("alter session reset store.json.writer.skip_null_fields "); } } @@ -67,13 +67,13 @@ public class TestCTASJson extends PlanTestBase { .sqlQuery(query) .ordered() .jsonBaselineFile("json/" + testName + "_out.json") - .optionSettingQueriesForTestQuery("alter session set store.format = 'json' ") + .optionSettingQueriesForTestQuery("alter session set `store.format` = 'json' ") .optionSettingQueriesForTestQuery("alter session set store.json.writer.skip_null_fields = false") // change from DEFAULT .build() .run(); } finally{ test("drop table " + testName + "_json" ); - test("alter session reset store.format "); + test("alter session reset `store.format` "); test("alter session reset store.json.writer.skip_null_fields "); } @@ -96,14 +96,14 @@ public class TestCTASJson extends PlanTestBase { .sqlQuery(query) .ordered() .jsonBaselineFile("json/" + testName + ".json") - .optionSettingQueriesForTestQuery("alter session set store.format = 'json' ") + .optionSettingQueriesForTestQuery("alter session set `store.format` = 'json' ") .optionSettingQueriesForTestQuery( "alter session set store.json.writer.skip_null_fields = true") // DEFAULT .build() .run(); }finally{ test("drop table " + testName + "_json" ); - test("alter session reset store.format "); + test("alter session reset `store.format` "); test("alter session reset store.json.writer.skip_null_fields "); } @@ -126,14 +126,14 @@ public class TestCTASJson extends PlanTestBase { .sqlQuery(query) .ordered() .jsonBaselineFile("json/" + testName + "_out.json") - .optionSettingQueriesForTestQuery("alter session set store.format = 'json' ") + .optionSettingQueriesForTestQuery("alter session set `store.format` = 'json' ") .optionSettingQueriesForTestQuery( "alter session set store.json.writer.skip_null_fields = false") // change from DEFAULT .build() .run(); } finally { test("drop table " + testName + "_json" ); - test("alter session reset store.format "); + test("alter session reset `store.format` "); test("alter session reset store.json.writer.skip_null_fields "); } diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestNestedDateTimeTimestamp.java b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestNestedDateTimeTimestamp.java index 6a0aa78fc..321dd538f 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestNestedDateTimeTimestamp.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/physical/impl/TestNestedDateTimeTimestamp.java @@ -119,7 +119,7 @@ public class TestNestedDateTimeTimestamp extends BaseTestQuery { String query = String.format("select * from %s limit 1", DATAFILE); String testName = "ctas_nested_datetime"; try { - test("alter session set store.format = 'json'"); + test("alter session set `store.format` = 'json'"); test("alter session set store.json.extended_types = false"); test("use dfs.tmp"); test("create table " + testName + "_json as " + query); @@ -129,7 +129,7 @@ public class TestNestedDateTimeTimestamp extends BaseTestQuery { testBuilder().sqlQuery(readQuery).ordered().jsonBaselineFile("baseline_nested_datetime.json").build().run(); } finally { test("drop table " + testName + "_json"); - test("alter session reset store.format "); + test("alter session reset `store.format` "); test("alter session reset store.json.extended_types "); } } @@ -142,7 +142,7 @@ public class TestNestedDateTimeTimestamp extends BaseTestQuery { String query = String.format("select * from %s limit 1", DATAFILE); String testName = "ctas_nested_datetime_extended"; try { - test("alter session set store.format = 'json'"); + test("alter session set `store.format` = 'json'"); test("alter session set store.json.extended_types = true"); test("use dfs.tmp"); test("create table " + testName + "_json as " + query); @@ -152,7 +152,7 @@ public class TestNestedDateTimeTimestamp extends BaseTestQuery { testBuilder().sqlQuery(readQuery).ordered().jsonBaselineFile("datetime.parquet").build().run(); } finally { test("drop table " + testName + "_json"); - test("alter session reset store.format "); + test("alter session reset `store.format` "); test("alter session reset store.json.extended_types "); } } @@ -165,7 +165,7 @@ public class TestNestedDateTimeTimestamp extends BaseTestQuery { String query = String.format("select * from %s limit 1", DATAFILE); String testName = "ctas_nested_datetime_extended"; try { - test("alter session set store.format = 'parquet'"); + test("alter session set `store.format` = 'parquet'"); test("use dfs.tmp"); test("create table " + testName + "_parquet as " + query); @@ -174,7 +174,7 @@ public class TestNestedDateTimeTimestamp extends BaseTestQuery { testBuilder().sqlQuery(readQuery).ordered().jsonBaselineFile("datetime.parquet").build().run(); } finally { test("drop table " + testName + "_parquet"); - test("alter session reset store.format "); + test("alter session reset `store.format` "); } } diff --git a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet2/TestDrillParquetReader.java b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet2/TestDrillParquetReader.java index 80fb495ba..4b5ed7ae0 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet2/TestDrillParquetReader.java +++ b/exec/java-exec/src/test/java/org/apache/drill/exec/store/parquet2/TestDrillParquetReader.java @@ -434,4 +434,17 @@ public class TestDrillParquetReader extends BaseTestQuery { .build().run(); } + @Test // DRILL-6856 + public void testIsTrueOrNullCondition() throws Exception { + testBuilder() + .sqlQuery("SELECT col_bln " + + "FROM cp.`parquetFilterPush/blnTbl/0_0_2.parquet` " + + "WHERE col_bln IS true OR col_bln IS null " + + "ORDER BY col_bln") + .ordered() + .baselineColumns("col_bln") + .baselineValuesForSingleColumn(true, null) + .go(); + } + } diff --git a/exec/java-exec/src/test/java/org/apache/drill/test/TestBuilder.java b/exec/java-exec/src/test/java/org/apache/drill/test/TestBuilder.java index 37e05cd7c..6c4cdadb4 100644 --- a/exec/java-exec/src/test/java/org/apache/drill/test/TestBuilder.java +++ b/exec/java-exec/src/test/java/org/apache/drill/test/TestBuilder.java @@ -30,6 +30,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.tuple.Pair; import org.apache.drill.common.expression.LogicalExpression; import org.apache.drill.common.expression.SchemaPath; @@ -70,7 +71,7 @@ public class TestBuilder { protected Map baselineTypeMap; // queries to run before the baseline or test queries, can be used to set options private String baselineOptionSettingQueries; - private String testOptionSettingQueries; + private String testOptionSettingQueries = ""; // two different methods are available for comparing ordered results, the default reads all of the records // into giant lists of objects, like one giant on-heap batch of 'vectors' // this flag enables the other approach which iterates through a hyper batch for the test query results and baseline @@ -110,7 +111,9 @@ public class TestBuilder { this.approximateEquality = approximateEquality; this.baselineTypeMap = baselineTypeMap; this.baselineOptionSettingQueries = baselineOptionSettingQueries; - this.testOptionSettingQueries = testOptionSettingQueries; + this.testOptionSettingQueries = StringUtils.isNotEmpty(testOptionSettingQueries) + ? testOptionSettingQueries.concat(" ; ") + : testOptionSettingQueries; this.highPerformanceComparison = highPerformanceComparison; this.expectedNumBatches = expectedNumBatches; } @@ -205,12 +208,12 @@ public class TestBuilder { */ public TestBuilder optionSettingQueriesForTestQuery(String queries) { - testOptionSettingQueries = queries; + testOptionSettingQueries += queries.concat(" ; "); return this; } public TestBuilder optionSettingQueriesForTestQuery(String query, Object... args) throws Exception { - testOptionSettingQueries = String.format(query, args); + testOptionSettingQueries += String.format(query, args).concat(" ; "); return this; } diff --git a/exec/jdbc-all/pom.xml b/exec/jdbc-all/pom.xml index d19003f04..67a3bb8af 100644 --- a/exec/jdbc-all/pom.xml +++ b/exec/jdbc-all/pom.xml @@ -512,7 +512,7 @@ This is likely due to you adding new dependencies to a java-exec and not updating the excludes in this module. This is important as it minimizes the size of the dependency of Drill application users. - 39500000 + 40000000 15000000 ${project.build.directory}/drill-jdbc-all-${project.version}.jar diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/AvaticaDrillSqlAccessor.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/AvaticaDrillSqlAccessor.java index a4d9e96fe..7b279aaa6 100644 --- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/AvaticaDrillSqlAccessor.java +++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/AvaticaDrillSqlAccessor.java @@ -30,6 +30,7 @@ import java.sql.Ref; import java.sql.SQLException; import java.sql.SQLFeatureNotSupportedException; import java.sql.SQLXML; +import java.sql.Struct; import java.sql.Time; import java.sql.Timestamp; import java.util.Calendar; @@ -207,6 +208,11 @@ public class AvaticaDrillSqlAccessor implements Accessor { throw new SQLFeatureNotSupportedException(); } + @Override + public Struct getStruct() throws SQLException { + throw new SQLFeatureNotSupportedException(); + } + @Override public Date getDate(Calendar calendar) throws SQLException { return underlyingAccessor.getDate(getCurrentRecordNumber()); diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillResultSetImpl.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillResultSetImpl.java index e3cf4bb16..59483937e 100644 --- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillResultSetImpl.java +++ b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/DrillResultSetImpl.java @@ -35,8 +35,6 @@ import java.sql.SQLXML; import java.sql.Time; import java.sql.Timestamp; import java.sql.Types; -import java.util.ArrayList; -import java.util.List; import java.util.TimeZone; import java.util.concurrent.TimeUnit; @@ -47,7 +45,6 @@ import org.apache.calcite.avatica.ColumnMetaData; import org.apache.calcite.avatica.Meta; import org.apache.calcite.avatica.QueryState; import org.apache.calcite.avatica.util.Cursor; -import org.apache.calcite.avatica.util.Cursor.Accessor; import org.apache.drill.jdbc.AlreadyClosedSqlException; import org.apache.drill.jdbc.DrillResultSet; import org.apache.drill.jdbc.ExecutionCanceledSqlException; @@ -1267,15 +1264,8 @@ public class DrillResultSetImpl extends AvaticaResultSet implements DrillResultS connection.getDriver().handler.onStatementExecute(statement, null); if (signature.cursorFactory != null) { - // Avatica accessors have to be wrapped to match Drill behaviour regarding exception thrown super.execute(); - List wrappedAccessorList = new ArrayList<>(accessorList.size()); - for(Accessor accessor: accessorList) { - wrappedAccessorList.add(new WrappedAccessor(accessor)); - } - this.accessorList = wrappedAccessorList; - } - else { + } else { DrillCursor drillCursor = new DrillCursor(connection, statement, signature); //Getting handle to elapsed timer for timeout purposes this.elapsedTimer = drillCursor.getElapsedTimer(); diff --git a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/WrappedAccessor.java b/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/WrappedAccessor.java deleted file mode 100644 index 22c2b961b..000000000 --- a/exec/jdbc/src/main/java/org/apache/drill/jdbc/impl/WrappedAccessor.java +++ /dev/null @@ -1,447 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.drill.jdbc.impl; - -import java.io.InputStream; -import java.io.Reader; -import java.math.BigDecimal; -import java.net.URL; -import java.sql.Array; -import java.sql.Blob; -import java.sql.Clob; -import java.sql.Date; -import java.sql.NClob; -import java.sql.Ref; -import java.sql.SQLException; -import java.sql.SQLXML; -import java.sql.Time; -import java.sql.Timestamp; -import java.util.Calendar; -import java.util.Map; - -import org.apache.calcite.avatica.util.Cursor.Accessor; - -/** - * Wraps Avatica {@code Accessor} instances to catch convertion exception - * which are thrown as {@code RuntimeException} and throws {@code SQLException} - * instead - * - */ -public class WrappedAccessor implements Accessor { - private final Accessor delegate; - - public WrappedAccessor(Accessor delegate) { - this.delegate = delegate; - } - - @Override - public boolean wasNull() throws SQLException { - return delegate.wasNull(); - } - - @Override - public String getString() throws SQLException { - try { - return delegate.getString(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public boolean getBoolean() throws SQLException { - try { - return delegate.getBoolean(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public byte getByte() throws SQLException { - try { - return delegate.getByte(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public short getShort() throws SQLException { - try { - return delegate.getShort(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public int getInt() throws SQLException { - try { - return delegate.getInt(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public long getLong() throws SQLException { - try { - return delegate.getLong(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public float getFloat() throws SQLException { - try { - return delegate.getFloat(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public double getDouble() throws SQLException { - try { - return delegate.getDouble(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public BigDecimal getBigDecimal() throws SQLException { - try { - return delegate.getBigDecimal(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public BigDecimal getBigDecimal(int scale) throws SQLException { - try { - return delegate.getBigDecimal(scale); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public byte[] getBytes() throws SQLException { - try { - return delegate.getBytes(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public InputStream getAsciiStream() throws SQLException { - try { - return delegate.getAsciiStream(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public InputStream getUnicodeStream() throws SQLException { - try { - return delegate.getUnicodeStream(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public InputStream getBinaryStream() throws SQLException { - try { - return delegate.getBinaryStream(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Object getObject() throws SQLException { - try { - return delegate.getObject(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Reader getCharacterStream() throws SQLException { - try { - return delegate.getCharacterStream(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Object getObject(Map> map) throws SQLException { - try { - return delegate.getObject(map); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Ref getRef() throws SQLException { - try { - return delegate.getRef(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Blob getBlob() throws SQLException { - try { - return delegate.getBlob(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Clob getClob() throws SQLException { - try { - return delegate.getClob(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Array getArray() throws SQLException { - try { - return delegate.getArray(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Date getDate(Calendar calendar) throws SQLException { - try { - return delegate.getDate(calendar); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Time getTime(Calendar calendar) throws SQLException { - try { - return delegate.getTime(calendar); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Timestamp getTimestamp(Calendar calendar) throws SQLException { - try { - return delegate.getTimestamp(calendar); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public URL getURL() throws SQLException { - try { - return delegate.getURL(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public NClob getNClob() throws SQLException { - try { - return delegate.getNClob(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public SQLXML getSQLXML() throws SQLException { - try { - return delegate.getSQLXML(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public String getNString() throws SQLException { - try { - return delegate.getNString(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public Reader getNCharacterStream() throws SQLException { - try { - return delegate.getNCharacterStream(); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - - @Override - public T getObject(Class type) throws SQLException { - try { - return delegate.getObject(type); - } catch(RuntimeException e) { - String message = e.getMessage(); - if (message != null && message.startsWith("cannot convert to")) { - throw new SQLException(e.getMessage(), e); - } - throw e; - } - } - -} diff --git a/pom.xml b/pom.xml index 530d3de2f..b9f17dab6 100644 --- a/pom.xml +++ b/pom.xml @@ -50,8 +50,8 @@ 19.0 2 1.10.0 - 1.17.0-drill-r2 - 1.12.0 + 1.18.0-drill-r0 + 1.13.0 3.0.11 1.6.0 2.9.5 @@ -1050,14 +1050,35 @@ - org.apache.drill - drill-shaded-guava - ${shaded.guava.version} - - - com.google.guava - guava - ${guava.version} + org.apache.calcite + calcite-core + ${calcite.version} + + + org.apache.calcite.avatica + avatica-core + + + org.jgrapht + jgrapht-jdk1.5 + + + commons-logging + commons-logging + + + com.fasterxml.jackson.core + jackson-annotations + + + com.fasterxml.jackson.core + jackson-core + + + com.fasterxml.jackson.core + jackson-databind + + org.apache.calcite.avatica @@ -1078,6 +1099,16 @@ + + org.apache.drill + drill-shaded-guava + ${shaded.guava.version} + + + com.google.guava + guava + ${guava.version} + org.msgpack msgpack @@ -2379,39 +2410,6 @@ xalan 2.7.1 - - - org.apache.calcite - calcite-core - ${calcite.version} - - - org.apache.calcite.avatica - avatica-core - - - org.jgrapht - jgrapht-jdk1.5 - - - commons-logging - commons-logging - - - com.fasterxml.jackson.core - jackson-annotations - - - com.fasterxml.jackson.core - jackson-core - - - com.fasterxml.jackson.core - jackson-databind - - - - net.sf.jpam jpam -- cgit v1.2.3