diff --git a/euler.yaml b/euler.yaml index 717191e..a0e5f6f 100644 --- a/euler.yaml +++ b/euler.yaml @@ -13,8 +13,8 @@ dependencies: branch: master revision: aa20a46b6ae5d638c23fa009fb1dd9b07727ffa2 beam: - branch: master - revision: 4bfeb46746212c6b54983844a3acd37853430065 + branch: Delete-with-limit-support + revision: fec10dfefab932bc2a1a6b5ee24985ac1deca943 overrides: record-dot-preprocessor: diff --git a/flake.lock b/flake.lock index 2d9cfa1..0ad9130 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1686732869, - "narHash": "sha256-NJ1CfZCboTZ3MEsxp57PoEz/X6tx8CEK/fz+R+JAbjk=", + "lastModified": 1689755711, + "narHash": "sha256-sHjeKR+oaxd/S17DmGfAnDxu86xJFV/0mSTP9cWxB4w=", "owner": "juspay", "repo": "beam", - "rev": "4bfeb46746212c6b54983844a3acd37853430065", + "rev": "fec10dfefab932bc2a1a6b5ee24985ac1deca943", "type": "github" }, "original": { diff --git a/src/Database/Beam/MySQL/Extra.hs b/src/Database/Beam/MySQL/Extra.hs index 04f9b9d..8270491 100644 --- a/src/Database/Beam/MySQL/Extra.hs +++ b/src/Database/Beam/MySQL/Extra.hs @@ -291,6 +291,7 @@ analyzeExpr ins e = case go e of Cast{} -> go e'.expr -- Field extractions from pure expressions are pure. Extract{} -> go e'.expr + JSONExtract{} -> go e'.expr <> go e'.key -- CURRENT_TIMESTAMP is pure within a transaction, which we assume we're -- in, as runInsertRowReturning is unsafe outside one. CurrentTimestamp -> Pure diff --git a/src/Database/Beam/MySQL/Syntax/Delete.hs b/src/Database/Beam/MySQL/Syntax/Delete.hs index 394e807..e974646 100644 --- a/src/Database/Beam/MySQL/Syntax/Delete.hs +++ b/src/Database/Beam/MySQL/Syntax/Delete.hs @@ -9,7 +9,8 @@ import Database.Beam.MySQL.Syntax.Select (MySQLExpressionSyntax, data MySQLDelete = DeleteStmt { tableName :: {-# UNPACK #-} !MySQLTableNameSyntax, - wher :: !(Maybe MySQLExpressionSyntax) + wher :: !(Maybe MySQLExpressionSyntax), + limit :: !(Maybe Int) } deriving stock (Eq, Show) @@ -23,8 +24,9 @@ instance IsSql92DeleteSyntax MySQLDelete where MySQLTableNameSyntax -> Maybe Text -> Maybe MySQLExpressionSyntax -> + Maybe Int -> MySQLDelete - deleteStmt tableName' _ wher' = - DeleteStmt tableName' wher' + deleteStmt tableName' _ wher' limit' = + DeleteStmt tableName' wher' limit' {-# INLINABLE deleteSupportsAlias #-} deleteSupportsAlias = const False diff --git a/src/Database/Beam/MySQL/Syntax/Render.hs b/src/Database/Beam/MySQL/Syntax/Render.hs index 7806b27..e8b6264 100644 --- a/src/Database/Beam/MySQL/Syntax/Render.hs +++ b/src/Database/Beam/MySQL/Syntax/Render.hs @@ -298,6 +298,12 @@ renderExpr es = case es of pure $ "EXTRACT" <> bracketWrap (field' <> " FROM " <> e') + JSONExtract{} -> do + field' <- renderExpr es.expr + e' <- renderExpr es.key + pure $ + "JSON_EXTRACT" <> + bracketWrap (field' <> ", " <> e') CurrentTimestamp -> pure "CURRENT_TIMESTAMP" Default -> pure "DEFAULT" In{} -> do @@ -412,6 +418,9 @@ renderPrefOp = pure . \case TUpper -> "UPPER" TTrim -> "TRIM" NAbs -> "ABS" + TJSONValid -> "JSON_VALID" + + renderCompOp :: CompOp -> RenderM Builder renderCompOp = pure . \case @@ -558,7 +567,8 @@ renderDelete' del = do pure $ "DELETE FROM " <> tableName' <> - foldMap (" WHERE " <>) wher' + foldMap (" WHERE " <>) wher' <> + maybe mempty (\l -> " LIMIT " <> textUtf8 (pack $ show l)) del.limit wrap :: (Semigroup s) => s -> s -> s -> s wrap l r v = l <> v <> r diff --git a/src/Database/Beam/MySQL/Syntax/Select.hs b/src/Database/Beam/MySQL/Syntax/Select.hs index c0cf966..2c6e120 100644 --- a/src/Database/Beam/MySQL/Syntax/Select.hs +++ b/src/Database/Beam/MySQL/Syntax/Select.hs @@ -166,7 +166,8 @@ data PrefOp = TLower | TUpper | TTrim | - NAbs + NAbs | + TJSONValid deriving stock (Eq, Show) data PostOp = @@ -241,6 +242,10 @@ data MySQLExpressionSyntax = field :: !MySQLExtractFieldSyntax, expr :: MySQLExpressionSyntax } | + JSONExtract { + expr :: MySQLExpressionSyntax, + key :: MySQLExpressionSyntax + } | CurrentTimestamp | Default | In { @@ -510,6 +515,14 @@ instance IsSql92ExpressionSyntax MySQLExpressionSyntax where MySQLExpressionSyntax -> MySQLExpressionSyntax extractE = Extract + {-# INLINABLE jsonValidE #-} + jsonValidE :: + MySQLExpressionSyntax -> + MySQLExpressionSyntax + jsonValidE = PrefixOperation TJSONValid + {-# INLINABLE jsonExtractE #-} + jsonExtractE :: MySQLExpressionSyntax -> MySQLExpressionSyntax -> MySQLExpressionSyntax + jsonExtractE = JSONExtract {-# INLINABLE existsE #-} existsE :: MySQLSelect -> MySQLExpressionSyntax existsE = Exists