diff --git a/CHANGELOG.md b/CHANGELOG.md index 107e513f8..946660726 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - #2534, Fix embedding a computed relationship with a normal relationship - @steve-chavez - #2362, Fix error message when [] is used inside select - @wolfgangwalther - #2475, Disallow !inner on computed columns - @wolfgangwalther + - #2285, Ignore leading and trailing spaces in column names when parsing the query string - @wolfgangwalther ### Changed diff --git a/src/PostgREST/ApiRequest/QueryParams.hs b/src/PostgREST/ApiRequest/QueryParams.hs index c193005a4..01a1e2896 100644 --- a/src/PostgREST/ApiRequest/QueryParams.hs +++ b/src/PostgREST/ApiRequest/QueryParams.hs @@ -352,15 +352,21 @@ pStar = string "*" $> "*" -- >>> P.parse pFieldName "" ":" -- Left (line 1, column 1): -- unexpected ":" --- expecting field name (* or [a..z0..9_ $]) +-- expecting field name (* or [a..z0..9_$]) -- -- >>> P.parse pFieldName "" "\":\"" -- Right ":" +-- +-- >>> P.parse pFieldName "" " no leading or trailing spaces " +-- Right "no leading or trailing spaces" +-- +-- >>> P.parse pFieldName "" "\" leading and trailing spaces \"" +-- Right " leading and trailing spaces " pFieldName :: Parser Text pFieldName = pQuotedValue <|> T.intercalate "-" . map toS <$> (pIdentifier `sepBy1` dash) - "field name (* or [a..z0..9_ $])" + "field name (* or [a..z0..9_$])" where isDash :: GenParser Char st () isDash = try ( char '-' >> notFollowedBy (char '>') ) @@ -630,8 +636,11 @@ pLogicPath = do pColumns :: Parser [FieldName] pColumns = pFieldName `sepBy1` lexeme (char ',') -pIdentifier :: Parser [Char] -pIdentifier = many1 $ letter <|> digit <|> oneOf "_ $" +pIdentifier :: Parser Text +pIdentifier = T.strip . toS <$> many1 pIdentifierChar + +pIdentifierChar :: Parser Char +pIdentifierChar = letter <|> digit <|> oneOf "_ $" mapError :: Either ParseError a -> Either QPError a mapError = mapLeft translateError diff --git a/test/spec/Feature/Query/AndOrParamsSpec.hs b/test/spec/Feature/Query/AndOrParamsSpec.hs index 246ed6dbc..917e2faea 100644 --- a/test/spec/Feature/Query/AndOrParamsSpec.hs +++ b/test/spec/Feature/Query/AndOrParamsSpec.hs @@ -200,7 +200,7 @@ spec actualPgVersion = it "cannot have zero conditions" $ get "/entities?or=()" `shouldRespondWith` [json|{ - "details": "unexpected \")\" expecting field name (* or [a..z0..9_ $]), negation operator (not) or logic operator (and, or)", + "details": "unexpected \")\" expecting field name (* or [a..z0..9_$]), negation operator (not) or logic operator (and, or)", "message": "\"failed to parse logic tree (())\" (line 1, column 4)", "code": "PGRST100", "hint": null diff --git a/test/spec/Feature/Query/InsertSpec.hs b/test/spec/Feature/Query/InsertSpec.hs index 0d00c410c..d14fd92d1 100644 --- a/test/spec/Feature/Query/InsertSpec.hs +++ b/test/spec/Feature/Query/InsertSpec.hs @@ -415,7 +415,7 @@ spec actualPgVersion = do {"id": 204, "body": "yyy"}, {"id": 205, "body": "zzz"}]|] `shouldRespondWith` - [json| {"details":"unexpected end of input expecting field name (* or [a..z0..9_ $])","message":"\"failed to parse columns parameter ()\" (line 1, column 1)","code":"PGRST100","hint":null} |] + [json| {"details":"unexpected end of input expecting field name (* or [a..z0..9_$])","message":"\"failed to parse columns parameter ()\" (line 1, column 1)","code":"PGRST100","hint":null} |] { matchStatus = 400 , matchHeaders = [] }