@Override public List<SimpleCommandResult> toResult(String sql, SqlNode sqlNode) throws Exception { final SqlLoadMaterialization load = SqlNodeUtil.unwrap(sqlNode, SqlLoadMaterialization.class); if(!SystemUser.SYSTEM_USERNAME.equals(context.getQueryUserName())) { throw SqlExceptionHelper.parseError("$LOAD MATERIALIZATION not supported.", sql, load.getParserPosition()).build(logger); } final ReflectionService service = Preconditions.checkNotNull(context.getAccelerationManager().unwrap(ReflectionService.class), "Couldn't unwrap ReflectionService"); final List<String> components = normalizeComponents(load.getMaterializationPath()); if (components == null) { throw SqlExceptionHelper.parseError("Invalid materialization path.", sql, load.getParserPosition()).build(logger); } final ReflectionId reflectionId = new ReflectionId(components.get(0)); final Optional<ReflectionGoal> goalOptional = service.getGoal(reflectionId); if (!goalOptional.isPresent()) { throw SqlExceptionHelper.parseError("Unknown reflection id.", sql, load.getParserPosition()).build(logger); } final ReflectionGoal goal = goalOptional.get(); final MaterializationId materializationId = new MaterializationId(components.get(1)); final Optional<Materialization> materializationOpt = service.getMaterialization(materializationId); if (!materializationOpt.isPresent()) { throw SqlExceptionHelper.parseError("Unknown materialization id.", sql, load.getParserPosition()).build(logger); } final Materialization materialization = materializationOpt.get(); // if the user already made changes to the reflection goal, let's stop right here Preconditions.checkState(Objects.equals(goal.getTag(), materialization.getReflectionGoalVersion()), "materialization no longer matches its goal"); refreshMetadata(goal, materialization); return Collections.singletonList(SimpleCommandResult.successful("Materialization metadata loaded.")); }
public SqlNode parse(String sql) { try { SqlParser parser = SqlParser.create(sql, parserConfig); return parser.parseStmt().accept(STRING_LITERAL_CONVERTER); } catch (SqlParseException e) { UserException.Builder builder = SqlExceptionHelper.parseError(sql, e); builder.message(isInnerQuery ? SqlExceptionHelper.INNER_QUERY_PARSING_ERROR : SqlExceptionHelper.QUERY_PARSING_ERROR); throw builder.build(logger); } }
throw SqlExceptionHelper.parseError("$COMPACT REFRESH not supported.", sql, compact.getParserPosition()) .build(logger); throw SqlExceptionHelper.parseError("Unknown materialization", sql, compact.getParserPosition()) .build(logger); Optional<ReflectionGoal> goalOpt = service.getGoal(reflectionId); if(!goalOpt.isPresent()) { throw SqlExceptionHelper.parseError("Unknown reflection id.", sql, compact.getParserPosition()).build(logger); throw SqlExceptionHelper.parseError("Unknown reflection id.", sql, compact.getParserPosition()).build(logger); throw SqlExceptionHelper.parseError("Unknown materialization id", sql, compact.getParserPosition()).build(logger); throw SqlExceptionHelper.parseError("Invalid materialization", sql, compact.getParserPosition()).build(logger); throw SqlExceptionHelper.parseError("Unknown new materialization id", sql, compact.getParserPosition()).build(logger);
throw SqlExceptionHelper.parseError("$MATERIALIZE not supported.", sql, materialize.getParserPosition()).build(logger); Optional<ReflectionGoal> goalOpt = service.getGoal(reflectionId); if(!goalOpt.isPresent()) { throw SqlExceptionHelper.parseError("Unknown reflection id.", sql, materialize.getReflectionIdPos()).build(logger); throw SqlExceptionHelper.parseError("Unknown reflection id.", sql, materialize.getReflectionIdPos()).build(logger); throw SqlExceptionHelper.parseError("Unknown materialization id.", sql, materialize.getReflectionIdPos()).build(logger);
@Test public void convertExceptionToQueryErrors() { // Fake logger to not pollute logs org.slf4j.Logger logger = mock(org.slf4j.Logger.class); SqlParseException parseException = new SqlParseException("test message", new SqlParserPos(7, 42, 13, 57), null, null, null); UserException userException = SqlExceptionHelper.parseError("SELECT FOO", parseException) .build(logger); List<QueryError> errors = QueryError.of(userException); assertEquals(1, errors.size()); QueryError error = errors.get(0); assertEquals("test message", error.getMessage()); assertEquals(7, error.getRange().getStartLine()); assertEquals(42, error.getRange().getStartColumn()); assertEquals(13, error.getRange().getEndLine()); assertEquals(57, error.getRange().getEndColumn()); }
@Test public void convertExceptionToQueryErrorsWithPosition() { // Fake logger to not pollute logs org.slf4j.Logger logger = mock(org.slf4j.Logger.class); SqlParseException parseException = new SqlParseException("test message 2", new SqlParserPos(7, 42, 7, 42), null, null, null); UserException userException = SqlExceptionHelper.parseError("SELECT BAR", parseException) .build(logger); List<QueryError> errors = QueryError.of(userException); assertEquals(1, errors.size()); QueryError error = errors.get(0); assertEquals("test message 2", error.getMessage()); assertEquals(7, error.getRange().getStartLine()); assertEquals(42, error.getRange().getStartColumn()); assertEquals(7, error.getRange().getEndLine()); assertEquals(42, error.getRange().getEndColumn()); } }
@Test public void convertExceptionToFailureInfo() { // Fake logger to not pollute logs org.slf4j.Logger logger = mock(org.slf4j.Logger.class); SqlParseException parseException = new SqlParseException("test message", new SqlParserPos(7, 42, 13, 57), null, null, null); UserException userException = SqlExceptionHelper.parseError("SELECT FOO", parseException) .build(logger); String verboseError = userException.getVerboseMessage(false); JobFailureInfo jobFailureInfo = JobsServiceUtil.toFailureInfo(verboseError); assertEquals(JobFailureInfo.Type.PARSE, jobFailureInfo.getType()); assertEquals(1, jobFailureInfo.getErrorsList().size()); JobFailureInfo.Error error = jobFailureInfo.getErrorsList().get(0); assertEquals("test message", error.getMessage()); assertEquals(7, (int) error.getStartLine()); assertEquals(42, (int) error.getStartColumn()); assertEquals(13, (int) error.getEndLine()); assertEquals(57, (int) error.getEndColumn()); } }