{"record":{"id":"930036ef113fd770","repo":"apache/seatunnel","slug":"invalid-sap-hana-jdbc-url-format-s-expected-p","errorCode":null,"errorMessage":"Invalid SAP HANA JDBC URL format: [%s], expected pattern: jdbc:sap://host:port","messagePattern":"Invalid SAP HANA JDBC URL format: \\[(.+?)\\], expected pattern: jdbc:sap://host:port","errorType":"validation","errorClass":"OptionValidationException","httpStatus":null,"severity":"error","filePath":"seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/saphana/SapHanaCatalogFactory.java","lineNumber":76,"sourceCode":"        return JdbcCommonOptions.baseCatalogRule(new SapHanaUrlValidator()).build();\n    }\n\n    static class SapHanaUrlValidator implements ConditionExtension<String> {\n        @Override\n        public String description() {\n            return \"SAP HANA JDBC URL must be a valid format (e.g. jdbc:sap://host:port)\";\n        }\n\n        @Override\n        public boolean evaluate(ReadonlyConfig config, String url) {\n            if (url == null || url.trim().isEmpty()) {\n                return false;\n            }\n            try {\n                JdbcUrlUtil.UrlInfo info = SapHanaURLParser.parse(url);\n                return StringUtils.isNotBlank(info.getHost());\n            } catch (IllegalArgumentException e) {\n                throw new OptionValidationException(\n                        String.format(\n                                \"Invalid SAP HANA JDBC URL format: [%s], \"\n                                        + \"expected pattern: jdbc:sap://host:port\",\n                                url));\n            }\n        }\n    }\n}\n","sourceCodeStart":58,"sourceCodeEnd":85,"githubUrl":"https://github.com/apache/seatunnel/blob/cf67b549a7a6c35fa0beb12d83c62892427ea919/seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/saphana/SapHanaCatalogFactory.java#L58-L85","documentation":"The SAP HANA JDBC URL validator in SapHanaCatalogFactory.evaluate() parses the configured URL with SapHanaURLParser; when the parser raises IllegalArgumentException (URL does not match jdbc:sap://host:port), the factory rethrows it as an OptionValidationException stating the expected pattern. This prevents a malformed URL from silently matching the dialect and failing later at connection time.","triggerScenarios":"Configuring a jdbc-sap HANA catalog/connection where the url option is present but malformed — e.g. missing host, missing port, wrong scheme (jdbc:hana://, jdbc:sap:/host), or trailing garbage the parser cannot handle.","commonSituations":"Copy-pasting a HANA JDBC URL from another tool with extra parameters misplaced; omitting the port (HANA typically requires instance-specific port like 30013/30015); using the wrong scheme prefix; typos like jdbc:sap//.","solutions":["Fix the url option to match jdbc:sap://host:port (plus optional path/params), e.g. jdbc:sap://hana-host:30015.","Confirm the scheme is exactly jdbc:sap:// and both host and port are present and non-empty.","Check for stray whitespace, quotes, or characters around the URL in the config file.","Test the corrected URL with SapHanaURLParser or a plain JDBC connection before rerunning the job."],"exampleFix":"// before\nurl = \"jdbc:sap://hana-host\"          # missing port\n# after\nurl = \"jdbc:sap://hana-host:30015\"","handlingStrategy":"validation","validationCode":"// java\nString url = config.get(\"url\");\nif (url == null || !url.matches(\"jdbc:sap://[^:/\\\\s]+:\\\\d+.*\")) {\n    throw new IllegalArgumentException(\"SAP HANA url must match jdbc:sap://host:port, got: \" + url);\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always include host and port (e.g. :30015) in the HANA URL.","Trim whitespace/quotes from config values.","Validate the URL with SapHanaURLParser in a unit test or startup check."],"tags":["sap-hana","jdbc-url","config-validation"],"backgroundTag":"invalid-url-format","analyzedSha":"cf67b549a7a6c35fa0beb12d83c62892427ea919","analyzedAt":"2026-09-10T21:44:55.265Z","contentChangedAt":"2026-09-10T21:44:55.265Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}