при выполнении такого теста попадание в разные исключения при каждом запуске теста.
private static void testInParallelCaliciteParser() {
SqlParser parser = SqlParser.create("select * from test",
SqlParser.configBuilder().setConformance(SqlConformanceEnum.DEFAULT).build());
ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(2);
Runnable runnableTask = () -> {
Instant startTime = Instant.now();
try {
//synchronized (parser) {
SqlNode parseQuery = parser.parseQuery("select COUNT(*) FROM common.test_table");
//}
System.out.println(new Date() + " [" + Thread.currentThread().getName()
+ "] after parsing qry, time taken in millis >> "
+ Duration.between(startTime, Instant.now()).toMillis());
} catch (SqlParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
};
IntStream.range(0, 4).forEach(i -> executor.submit(runnableTask));
}
вот исключение.
org.apache.calcite.sql.parser.SqlParseException: обнаружен выбор в строке 1, столбце 1. Ожидалось одно из: ABS... ALTER... ARRAY... AVG... CALL... CARDINALITY... CASE ... CAST ... CEIL ... CEILING ... CHAR_LENGTH ... CHARACTER_LENGTH ... CLASSIFIER ... COALESCE ... COLLECT ... CONVERT ... COUNT ... COVAR_POP ... COVAR_SAMP . .. CUME_DIST ... CURRENT ... CURRENT_CATALOG ... CURRENT_DATE ... CURRENT_DEFAULT_TRANSFORM_GROUP ... CURRENT_PATH ... CURRENT_ROLE ... CURRENT_SCHEMA ... CURRENT_TIME ... CURRENT_TIMESTAMP ... CURRENT_USER ... CURSOR ... DATE ... DELETE ... DENSE_RANK ... DESCRIBE ... ELEMENT ... EVERY ... EXISTS ... EXP ... EXPLAIN ... EXTRACT ... FALSE ... FIRST_VALUE ... FLOOR . .. FUSION... ГРУППИРОВКА... ЧАС... ВСТАВКА... ПЕРЕСЕЧЕНИЕ... ИНТЕРВАЛ... JSON_ARRAY... JSON_ARRAYAGG... JSON_EXISTS... JSON_OBJECT... JSON_OBJECTAGG... JSON_QUERY... JSON_VALUE... LAG... LAST_VALUE... LEAD... LEFT... LN... LOCALTIME... LOCALTIMESTAMP... LOWER... MATCH_NUMBER.. MAX... MERGE... MIN... MINUTE... MOD... MONTH... MULTISET... NEW... NEXT... NOT... NTH_VALUE... NTILE... NULL ... NULLIF ... OCTET_LENGTH ... OVERLAY ... PERCENT_RANK ... PERIOD ... POSITION ... POWER ... PREV ... RANK ... REGR_COUNT ... REGR_SXX ... REGR_SYY .. .RESET... RIGHT... ROW... ROW_NUMBER... RUNNING... SECOND... SELECT... SESSION_USER... SET... SOME... SPECIFIC... SQRT... STDDEV_POP ... STDDEV_SAMP ... SUBSTRING ... SUM ... SYSTEM_USER ... TABLE ... TIME ... TIMESTAMP ... TRANSLATE ... TRIM ... TRUE ... TRUNCATE ... UNKNOWN .. ОБНОВЛЕНИЕ... ЗАПИСЬ... ОБНОВЛЕНИЕ... ПОЛЬЗОВАТЕЛЬ... ЗНАЧЕНИЯ... VAR_POP... VAR_SAMP... С... ГОД... ‹UNSIGNED_INTEGER_LITERAL›... ‹APPROX_NUMERIC_LITERAL›... ‹ DECIMAL_NUMERIC_LITERAL› ... ‹BINARY_STRING_LITERAL› … ‹QUOTED_STRING› … ‹PREFIXED_STRING_LITERAL› … ‹UNICODE_STRING_LITERAL› … ( ... ‹LBRACE_D› … ‹LBRACE_T› … ‹LBRACE_TS› .. ‹LBRACE_FN› ... ? ... + ... - ... ‹BRACKET_QUOTED_IDENTIFIER› … ‹QUOTED_IDENTIFIER› … ‹BACK_QUOTED_IDENTIFIER› … … ‹UNICODE_QUOTED_IDENTIFIER› …
at org.apache.calcite.sql.parser.impl.SqlParserImpl.convertException(SqlParserImpl.java:365)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.normalizeException(SqlParserImpl.java:150)
at org.apache.calcite.sql.parser.SqlParser.handleException(SqlParser.java:148)
at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:163)
at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:178)
at com.apporchid.cloudseer.db.qry.helper.TestMultiThreadSafe.lambda$5(TestMultiThreadSafe.java:142)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:748)
Вызвано: org.apache.calcite.sql.parser.impl.ParseException: обнаружен выбор в строке 1, столбце 1. Ожидалось одно из: ABS... ALTER... ARRAY... AVG... CALL.. .CARDINALITY... CASE... CAST... CEIL... CEILING... CHAR_LENGTH... CHARACTER_LENGTH... CLASSIFIER... COALESCE... COLLECT... CONVERT... COUNT... COVAR_POP ... COVAR_SAMP ... CUME_DIST ... CURRENT ... CURRENT_CATALOG ... CURRENT_DATE ... CURRENT_DEFAULT_TRANSFORM_GROUP ... CURRENT_PATH ... CURRENT_ROLE ... CURRENT_SCHEMA ... CURRENT_TIME ... CURRENT_TIMESTAMP ... CURRENT_USER .. CURSOR... DATE... DELETE... DENSE_RANK... DESCRIBE... ELEMENT... EVERY... EXISTS... EXP... EXPLAIN... EXTRACT... FALSE... FIRST_VALUE ... ПОЛ ... ОБЪЕДИНЕНИЕ ... ГРУППИРОВКА ... ЧАС ... ВСТАВКА ... ПЕРЕСЕЧЕНИЕ ... ИНТЕРВАЛ ... JSON_ARRAY ... JSON_ARRAYAGG ... JSON_EXISTS ... JSON_OBJECT ... JSON_OBJECTAGG .. JSON_QUERY ... JSON_VALUE ... LAG ... LAST_VALUE ... LEAD ... LEFT ... LN ... LOCALTIME ... LOCALTIMESTAMP ... LOWER ... MA TCH_NUMBER ... MAX ... MERGE ... MIN ... MINUTE ... MOD ... MONTH ... MULTISET ... NEW ... NEXT ... NOT ... NTH_VALUE ... NTILE . .. NULL ... NULLIF ... OCTET_LENGTH ... OVERLAY ... PERCENT_RANK ... PERIOD ... POSITION ... POWER ... PREV ... RANK ... REGR_COUNT ... REGR_SXX ... REGR_SYY ... RESET ... RIGHT ... ROW ... ROW_NUMBER ... RUNNING ... SECOND ... SELECT ... SESSION_USER ... SET ... SOME ... SPECIFIC ... SQRT . .. STDDEV_POP ... STDDEV_SAMP ... SUBSTRING ... SUM ... SYSTEM_USER ... TABLE ... TIME ... TIMESTAMP ... TRANSLATE ... TRIM ... TRUE ... TRUNCATE ... UNKNOWN ... UPDATE ... UPPER ... UPSERT ... USER ... VALUES ... VAR_POP ... VAR_SAMP ... WITH ... YEAR ... ‹UNSIGNED_INTEGER_LITERAL› … ‹APPROX_NUMERIC_LITERAL› . .. ‹DECIMAL_NUMERIC_LITERAL› ... ‹BINARY_STRING_LITERAL› ... ‹QUOTED_STRING› ... ‹PREFIXED_STRING_LITERAL› ... ‹UNICODE_STRING_LITERAL› ... ( ... ‹LBRACE_D› ... ‹LBRACE_T› ... ‹LBRACE_TS › ... ‹LBRACE_FN› ... ? ... + ... - ... ‹BRACKET_QUOTED_IDENTIFIER› … ‹QUOTED_IDENTIFIER› … ‹BACK_QUOTED_IDENTIFIER› … … ‹UNICODE_QUOTED_IDENTIFIER› …
at org.apache.calcite.sql.parser.impl.SqlParserImpl.generateParseException(SqlParserImpl.java:32563)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.jj_consume_token(SqlParserImpl.java:32377)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.SqlStmt(SqlParserImpl.java:3679)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.SqlStmtEof(SqlParserImpl.java:3691)
at org.apache.calcite.sql.parser.impl.SqlParserImpl.parseSqlStmtEof(SqlParserImpl.java:197)
at org.apache.calcite.sql.parser.SqlParser.parseQuery(SqlParser.java:161)
... 7 more
Потокобезопасность не является явной целью проектирования синтаксического анализатора, поэтому не стоит рассчитывать на то, что он будет поточно-ориентированным. Если вы считаете, что это серьезная проблема, я предлагаю начать обсуждение в списке рассылки Calcite ([email protected]), чтобы обсудить возможные решения, которые могут потребовать внесения изменений в сам Calcite.