{"record":{"id":"7095e1f3342fa83f","repo":"prestodb/presto","slug":"view-parse-error","errorCode":"VIEW_PARSE_ERROR","errorMessage":"Failed parsing stored view '%s': %s","messagePattern":"Failed parsing stored view '(.+?)': (.+?)","errorType":"error_code","errorClass":"SemanticException","httpStatus":null,"severity":"error","filePath":"presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java","lineNumber":5257,"sourceCode":"                    .setCatalog(catalog.orElse(null))\n                    .setSchema(schema.orElse(null))\n                    .setTimeZoneKey(session.getTimeZoneKey())\n                    .setLocale(session.getLocale())\n                    .setRemoteUserAddress(session.getRemoteUserAddress().orElse(null))\n                    .setUserAgent(session.getUserAgent().orElse(null))\n                    .setClientInfo(session.getClientInfo().orElse(null))\n                    .setStartTime(session.getStartTime());\n            session.getConnectorProperties().forEach((connectorId, properties) -> properties.forEach((k, v) -> viewSessionBuilder.setConnectionProperty(connectorId, k, v)));\n            return viewSessionBuilder.build();\n        }\n\n        private Query parseView(String view, QualifiedObjectName name, Node node)\n        {\n            try {\n                return (Query) sqlParser.createStatement(view, createParsingOptions(session, warningCollector));\n            }\n            catch (ParsingException e) {\n                throw new SemanticException(VIEW_PARSE_ERROR, node, \"Failed parsing stored view '%s': %s\", name, e.getMessage());\n            }\n        }\n\n        private boolean isViewStale(List<ViewDefinition.ViewColumn> columns, Collection<Field> fields)\n        {\n            if (columns.size() != fields.size()) {\n                return true;\n            }\n\n            List<Field> fieldList = ImmutableList.copyOf(fields);\n            for (int i = 0; i < columns.size(); i++) {\n                ViewDefinition.ViewColumn column = columns.get(i);\n                Field field = fieldList.get(i);\n                if (!column.getName().equalsIgnoreCase(field.getName().orElse(null)) ||\n                        !areViewColumnTypesCompatible(column.getType(), field.getType())) {\n                    return true;\n                }\n            }","sourceCodeStart":5239,"sourceCodeEnd":5275,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-main-base/src/main/java/com/facebook/presto/sql/analyzer/StatementAnalyzer.java#L5239-L5275","documentation":"Stored views keep their SQL text; when queried, Presto re-parses that text with the session's parsing options. If parsing fails (ParsingException), the analyzer wraps it as VIEW_PARSE_ERROR naming the view and the parser's message. This means the persisted view definition is syntactically invalid for the current parser.","triggerScenarios":"Querying a view whose stored definition fails sqlParser.createStatement (e.g. corrupted/legacy definition created by another engine or an old Presto syntax no longer accepted); thrown from parseView in StatementAnalyzer.","commonSituations":"Views created by a different engine (e.g. Hive) with dialect-specific syntax; Presto upgrade dropping legacy syntax support; manually edited metadata store corrupting the view text.","solutions":["Check the wrapped ParsingException message for the exact syntax problem","Recreate the view with current Presto SQL syntax: DROP VIEW then CREATE VIEW","If the view came from another engine, rewrite its body in Presto-compatible SQL","Verify after upgrade that legacy views still parse (test with SELECT * FROM view)"],"exampleFix":"-- before (unsupported syntax in view body)\nCREATE VIEW v AS SELECT a FROM t GROUP BY 1;\n-- after\nCREATE VIEW v AS SELECT a FROM t GROUP BY a;","handlingStrategy":"try-catch","validationCode":"// Parse view definitions with the same options before persisting:\ntry {\n    sqlParser.createStatement(viewSql, createParsingOptions(session, warningCollector));\n} catch (ParsingException e) {\n    throw new IllegalArgumentException(\"View body does not parse: \" + e.getErrorMessage());\n}","typeGuard":null,"tryCatchPattern":"try { return session.execute(\"SELECT * FROM \" + viewName); }\ncatch (SemanticException e) {\n    if (e.getCode() == VIEW_PARSE_ERROR) {\n        throw new ViewParseException(\"Stored view SQL is invalid; recreate the view\", e);\n    } else { throw e; }\n}","preventionTips":["Always create views through Presto with CREATE VIEW so syntax is validated at creation","After engine upgrades, smoke-test all stored views","Never hand-edit view SQL in metadata stores"],"tags":["sql","view","parse","syntax"],"backgroundTag":"view-parse-failed","analyzedSha":"55bb57d202de3b926896fa966c2c4a44c779634e","analyzedAt":"2026-09-04T12:50:26.162Z","contentChangedAt":"2026-09-04T12:50:26.162Z","schemaVersion":2},"datasetVersion":"2026-09-11T21:17:09.523Z"}