{"record":{"id":"0c6f6e8125c990a6","repo":"prestodb/presto","slug":"invalid-function-argument-0c6f6e","errorCode":"INVALID_FUNCTION_ARGUMENT","errorMessage":"Invalid QuadKey digit sequence: ","messagePattern":"Invalid QuadKey digit sequence: ","errorType":"error_code","errorClass":"PrestoException","httpStatus":null,"severity":"warning","filePath":"presto-geospatial-toolkit/src/main/java/com/facebook/presto/geospatial/BingTile.java","lineNumber":118,"sourceCode":"        int tileX = 0;\n        int tileY = 0;\n        for (int i = zoomLevel; i > 0; i--) {\n            int mask = 1 << (i - 1);\n            switch (quadKey.charAt(zoomLevel - i)) {\n                case '0':\n                    break;\n                case '1':\n                    tileX |= mask;\n                    break;\n                case '2':\n                    tileY |= mask;\n                    break;\n                case '3':\n                    tileX |= mask;\n                    tileY |= mask;\n                    break;\n                default:\n                    throw new PrestoException(INVALID_FUNCTION_ARGUMENT, \"Invalid QuadKey digit sequence: \" + quadKey);\n            }\n        }\n\n        return new BingTile(tileX, tileY, zoomLevel);\n    }\n\n    @JsonProperty\n    public int getX()\n    {\n        return x;\n    }\n\n    @JsonProperty\n    public int getY()\n    {\n        return y;\n    }\n","sourceCodeStart":100,"sourceCodeEnd":136,"githubUrl":"https://github.com/prestodb/presto/blob/55bb57d202de3b926896fa966c2c4a44c779634e/presto-geospatial-toolkit/src/main/java/com/facebook/presto/geospatial/BingTile.java#L100-L136","documentation":"BingTile.fromQuadKey parses a QuadKey string digit-by-digit, where each digit must be one of '0'-'3'. Any other character hits the default branch and throws INVALID_FUNCTION_ARGUMENT, meaning the input is not a valid Bing Maps quadkey for the bing_tile_quadkey/geometry functions.","triggerScenarios":"Calling a geospatial SQL function with a quadkey containing characters outside '0','1','2','3' (e.g. '024', 'abc', empty or whitespace-containing strings passing validation).","commonSituations":"Copy-pasting identifiers that look like quadkeys but are base-10 tile ids or hex strings; typos like 'o' vs '0'; passing latitude/longitude strings instead of quadkeys.","solutions":["Ensure the quadkey contains only characters 0-3 and its length equals the zoom level (1-23).","Use bing_tile(zoom, x, y) or bing_tile_at(lat, lon, zoom) to construct tiles instead of hand-built quadkeys.","Validate input data upstream before invoking the function."],"exampleFix":"// before\nSELECT bing_tile_quadkey('01234abc'); -- invalid digits\n// after\nSELECT bing_tile_quadkey('0123'); -- only 0-3 digits","handlingStrategy":"validation","validationCode":"boolean isValidQuadKey(String q) {\n    return q != null && !q.isEmpty() && q.length() <= 23\n        && q.chars().allMatch(c -> c >= '0' && c <= '3');\n}","typeGuard":"boolean isQuadKey(String s) {\n    return s != null && s.matches(\"[0-3]{1,23}\");\n}","tryCatchPattern":"try {\n    BingTile tile = BingTile.fromQuadKey(quadKey);\n} catch (PrestoException e) {\n    if (e.getErrorCode().equals(INVALID_FUNCTION_ARGUMENT.toErrorCode())) {\n        // sanitize or reject the quadKey input\n    }\n}","preventionTips":["Validate quadkeys with the regex ^[0-3]{1,23}$ before use.","Prefer bing_tile_at(latitude, longitude, zoom) to derive tiles from coordinates.","Don't confuse decimal tile ids or hex strings with quadkeys.","Sanitize upstream data sources that claim to provide quadkeys."],"tags":["geospatial","bing-tile","invalid-input","function-argument"],"backgroundTag":"invalid-quadkey","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"}