From 449e919aa937d8f63f3d73761e5668f58d182dac Mon Sep 17 00:00:00 2001 From: Pranav Parashar Date: Tue, 18 Jul 2023 14:23:48 +0530 Subject: [PATCH 1/5] added support for delete with limit --- euler.yaml | 4 ++-- flake.lock | 6 +++--- src/Database/Beam/MySQL/Syntax/Delete.hs | 8 +++++--- src/Database/Beam/MySQL/Syntax/Render.hs | 3 ++- 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/euler.yaml b/euler.yaml index 717191e..1a2b6bc 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: a26730565cdaa7c5a8c91b2bc401f30eb10d4748 overrides: record-dot-preprocessor: diff --git a/flake.lock b/flake.lock index 2d9cfa1..1b71cc6 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1686732869, - "narHash": "sha256-NJ1CfZCboTZ3MEsxp57PoEz/X6tx8CEK/fz+R+JAbjk=", + "lastModified": 1689657701, + "narHash": "sha256-3o7cKr/n0JkQyza3T1vaUOBn6G3WgGQTrjgq50tshw4=", "owner": "juspay", "repo": "beam", - "rev": "4bfeb46746212c6b54983844a3acd37853430065", + "rev": "a26730565cdaa7c5a8c91b2bc401f30eb10d4748", "type": "github" }, "original": { diff --git a/src/Database/Beam/MySQL/Syntax/Delete.hs b/src/Database/Beam/MySQL/Syntax/Delete.hs index 394e807..ca35cb5 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 Integer) } deriving stock (Eq, Show) @@ -23,8 +24,9 @@ instance IsSql92DeleteSyntax MySQLDelete where MySQLTableNameSyntax -> Maybe Text -> Maybe MySQLExpressionSyntax -> + Maybe Integer -> 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 12a7903..5544845 100644 --- a/src/Database/Beam/MySQL/Syntax/Render.hs +++ b/src/Database/Beam/MySQL/Syntax/Render.hs @@ -558,7 +558,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 From 6abe147945afb35c8a0adc9beef601a3f7b7991e Mon Sep 17 00:00:00 2001 From: Pranav Parashar Date: Tue, 18 Jul 2023 15:55:56 +0530 Subject: [PATCH 2/5] dependency bump --- euler.yaml | 2 +- flake.lock | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/euler.yaml b/euler.yaml index 1a2b6bc..a5038cd 100644 --- a/euler.yaml +++ b/euler.yaml @@ -14,7 +14,7 @@ dependencies: revision: aa20a46b6ae5d638c23fa009fb1dd9b07727ffa2 beam: branch: Delete-with-limit-support - revision: a26730565cdaa7c5a8c91b2bc401f30eb10d4748 + revision: 2d9cdcb20adf92ae578a8ba69d7a9ae044f251bc overrides: record-dot-preprocessor: diff --git a/flake.lock b/flake.lock index 1b71cc6..69263de 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1689657701, - "narHash": "sha256-3o7cKr/n0JkQyza3T1vaUOBn6G3WgGQTrjgq50tshw4=", + "lastModified": 1689675795, + "narHash": "sha256-soX2WYo2L9o2LAtweA4WoPjTLT1l8FlJVvl+hnS2dwc=", "owner": "juspay", "repo": "beam", - "rev": "a26730565cdaa7c5a8c91b2bc401f30eb10d4748", + "rev": "2d9cdcb20adf92ae578a8ba69d7a9ae044f251bc", "type": "github" }, "original": { From f3e8ca36bfbf220b7eb6d7652db947b58b0a24c6 Mon Sep 17 00:00:00 2001 From: Pranav Parashar Date: Wed, 19 Jul 2023 14:12:41 +0530 Subject: [PATCH 3/5] bump commit --- euler.yaml | 2 +- flake.lock | 6 +++--- src/Database/Beam/MySQL/Syntax/Delete.hs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/euler.yaml b/euler.yaml index a5038cd..a0e5f6f 100644 --- a/euler.yaml +++ b/euler.yaml @@ -14,7 +14,7 @@ dependencies: revision: aa20a46b6ae5d638c23fa009fb1dd9b07727ffa2 beam: branch: Delete-with-limit-support - revision: 2d9cdcb20adf92ae578a8ba69d7a9ae044f251bc + revision: fec10dfefab932bc2a1a6b5ee24985ac1deca943 overrides: record-dot-preprocessor: diff --git a/flake.lock b/flake.lock index 69263de..0ad9130 100644 --- a/flake.lock +++ b/flake.lock @@ -7,11 +7,11 @@ ] }, "locked": { - "lastModified": 1689675795, - "narHash": "sha256-soX2WYo2L9o2LAtweA4WoPjTLT1l8FlJVvl+hnS2dwc=", + "lastModified": 1689755711, + "narHash": "sha256-sHjeKR+oaxd/S17DmGfAnDxu86xJFV/0mSTP9cWxB4w=", "owner": "juspay", "repo": "beam", - "rev": "2d9cdcb20adf92ae578a8ba69d7a9ae044f251bc", + "rev": "fec10dfefab932bc2a1a6b5ee24985ac1deca943", "type": "github" }, "original": { diff --git a/src/Database/Beam/MySQL/Syntax/Delete.hs b/src/Database/Beam/MySQL/Syntax/Delete.hs index ca35cb5..e974646 100644 --- a/src/Database/Beam/MySQL/Syntax/Delete.hs +++ b/src/Database/Beam/MySQL/Syntax/Delete.hs @@ -10,7 +10,7 @@ import Database.Beam.MySQL.Syntax.Select (MySQLExpressionSyntax, data MySQLDelete = DeleteStmt { tableName :: {-# UNPACK #-} !MySQLTableNameSyntax, wher :: !(Maybe MySQLExpressionSyntax), - limit :: !(Maybe Integer) + limit :: !(Maybe Int) } deriving stock (Eq, Show) @@ -24,7 +24,7 @@ instance IsSql92DeleteSyntax MySQLDelete where MySQLTableNameSyntax -> Maybe Text -> Maybe MySQLExpressionSyntax -> - Maybe Integer -> + Maybe Int -> MySQLDelete deleteStmt tableName' _ wher' limit' = DeleteStmt tableName' wher' limit' From 253ec12ad90087809a02a646ccd788dde0f6af08 Mon Sep 17 00:00:00 2001 From: Pranav Parashar Date: Tue, 14 May 2024 15:56:48 +0530 Subject: [PATCH 4/5] Revert "Merge branch 'master' of https://github.com/juspay/beam-mysql into delete-with-limit" This reverts commit c51a13686e6546e4059fc55e3c30cab292f35ef6, reversing changes made to f3e8ca36bfbf220b7eb6d7652db947b58b0a24c6. --- .envrc | 1 - beam-mysql.cabal | 69 ++++--- build.nix | 34 ++++ cabal.project | 3 - euler.yaml | 69 +++++++ flake.lock | 226 ++++++----------------- flake.nix | 79 +++----- nix/custom-haskell-overlay.nix | 10 + nix/euler-gen-info | 3 + nix/overlay.nix | 70 +++++++ src/Database/Beam/MySQL/Syntax/Render.hs | 6 +- 11 files changed, 301 insertions(+), 269 deletions(-) delete mode 100644 .envrc create mode 100644 build.nix delete mode 100644 cabal.project create mode 100644 euler.yaml create mode 100644 nix/custom-haskell-overlay.nix create mode 100644 nix/euler-gen-info create mode 100644 nix/overlay.nix diff --git a/.envrc b/.envrc deleted file mode 100644 index 3550a30..0000000 --- a/.envrc +++ /dev/null @@ -1 +0,0 @@ -use flake diff --git a/beam-mysql.cabal b/beam-mysql.cabal index 1477d5e..a49b237 100644 --- a/beam-mysql.cabal +++ b/beam-mysql.cabal @@ -30,18 +30,17 @@ common common-lang -Wall -Wcompat -Wincomplete-record-updates -Wincomplete-uni-patterns -Wredundant-constraints -Werror -fplugin=RecordDotPreprocessor - -Wwarn=ambiguous-fields build-depends: - , base <5 - , beam-core - , generics-sop - , mysql-haskell - , record-dot-preprocessor - , record-hasfield - , safe-exceptions - , text - , unordered-containers + , base >=4.13 && <5 + , beam-core ^>=0.9.0.0 + , generics-sop ^>=0.5.1.0 + , mysql-haskell ^>=0.8.4.2 + , record-dot-preprocessor ^>=0.2.7 + , record-hasfield ^>=1.0 + , safe-exceptions ^>=0.1.7.0 + , text ^>=1.2.4.0 + , unordered-containers ^>=0.2.10.0 default-extensions: DataKinds @@ -71,7 +70,7 @@ common common-test build-depends: , beam-mysql , db - , tasty + , tasty ^>=1.4.1 -- Flags @@ -133,22 +132,22 @@ library Database.Beam.MySQL.Utils build-depends: - , aeson - , binary - , bytestring - , fmt - , free - , hashable > 1.3 - , int-cast - , io-streams - , mason - , mtl - , mysql-haskell - , safe-exceptions - , scientific - , text - , time - , vector + , aeson ^>=1.4.7.1 || ^>=1.5.0.0 + , binary ^>=0.8.7.0 + , bytestring ^>=0.10.10.0 + , fmt ^>=0.6.1.2 + , free ^>=5.1.3 + , hashable ^>=1.3.0.0 + , int-cast ^>=0.2.0.0 + , io-streams ^>=1.5.1.0 + , mason ^>=0.2.3 + , mtl ^>=2.2.2 + , mysql-haskell ^>=0.8.4.2 + , safe-exceptions ^>=0.1.7.0 + , scientific ^>=0.3.6.2 + , text ^>=1.2.4.0 + , time ^>=1.9.3 + , vector ^>=0.12.1.2 if flag(lenient) cpp-options: -DLENIENT @@ -191,9 +190,9 @@ library pool exposed-modules: Pool build-depends: , BoundedChan - , lifted-base - , monad-control - , transformers-base + , lifted-base ^>=0.2.3.12 + , monad-control ^>=1.0.2.3 + , transformers-base ^>=0.4.5.2 hs-source-dirs: pool @@ -208,7 +207,7 @@ test-suite generation main-is: Main.hs build-depends: , aeson - , tasty-hunit + , tasty-hunit ^>=0.10.0.3 hs-source-dirs: test/generation @@ -235,11 +234,11 @@ test-suite via-json main-is: Main.hs build-depends: , aeson - , hedgehog + , hedgehog ^>=1.0.5 , lifted-base , pool , scientific - , tasty-hedgehog + , tasty-hedgehog ^>=1.1.0.0 , vector hs-source-dirs: test/via-json @@ -266,7 +265,7 @@ test-suite unicode main-is: Main.hs build-depends: , fmt - , split + , split ^>=0.2.3.4 , tasty-hunit hs-source-dirs: test/unicode @@ -321,7 +320,7 @@ test-suite leniency type: exitcode-stdio-1.0 main-is: Main.hs build-depends: - , ieee754 + , ieee754 ^>=0.8.0 , tasty-hunit , vector diff --git a/build.nix b/build.nix new file mode 100644 index 0000000..d86fdfe --- /dev/null +++ b/build.nix @@ -0,0 +1,34 @@ +{ devShell ? false, inCI ? false }: +let + flake-compat = fetchTarball { + url = "https://github.com/edolstra/flake-compat/archive/19576c2aea7f074ff0da818b21a8b0950ff6ec86.tar.gz"; + sha256 = "13jf267qvd4fvph27flp5slrn6w2q26mhpakr8bj2ppqgyjamb79"; + }; + + nix-inclusive = fetchTarball { + url = "https://github.com/juspay/nix-inclusive/archive/2ca1706029bfcf4bb7eaf17b4f32e49f436a148e.tar.gz"; + sha256 = "1y3vhqnbh5kg906fpw22h670ppl8238xwv0dx7zdcp22212zdjnx"; + }; + + filter = import "${nix-inclusive}/inclusive.nix" { lib = (import {}).lib; }; + path = + filter ./. [ + ./flake.nix + ./flake.lock + ./nix/overlay.nix + ./src + ./test + ./db + ./pool + ./beam-mysql.cabal + ./LICENSE + ]; + attr = if devShell then "devShell" else "defaultPackage"; + compat-attr = if devShell then "shellNix" else "defaultNix"; + + flake-drv = + if inCI + then (import flake-compat { src = path; }).${compat-attr} + else (builtins.getFlake (toString (builtins.unsafeDiscardStringContext path))); +in +flake-drv.${attr}.${builtins.currentSystem} diff --git a/cabal.project b/cabal.project deleted file mode 100644 index ff32ffd..0000000 --- a/cabal.project +++ /dev/null @@ -1,3 +0,0 @@ -packages: - . - diff --git a/euler.yaml b/euler.yaml new file mode 100644 index 0000000..a0e5f6f --- /dev/null +++ b/euler.yaml @@ -0,0 +1,69 @@ +name: beam-mysql +allowed-paths: +- src +- test +- db +- pool +- beam-mysql.cabal +- LICENSE + + +dependencies: + euler-build: + branch: master + revision: aa20a46b6ae5d638c23fa009fb1dd9b07727ffa2 + beam: + branch: Delete-with-limit-support + revision: fec10dfefab932bc2a1a6b5ee24985ac1deca943 + +overrides: + record-dot-preprocessor: + version: 0.2.7 + sha256: 0dyn5wpn0p4sc1yw4zq9awrl2aa3gd3jamllfxrg31v3i3l6jvbw + source: hackage + + bytestring-lexing: + source: github + owner: juspay + repo: bytestring-lexing + commit: 0a46db1139011736687cb50bbd3877d223bcb737 + sha256: 1jrwhlp8xs4m21xfr843278j3i7h4sxyjpq67l6lzc36pqan9zlz + mysql-haskell: + source: github + owner: aravindgopall + repo: mysql-haskell + commit: 55348ea51ad1070d951f35408ebc391dbbf0ec75 + sha256: 0f00dmhpbqm5hy76nrz9mzz7nnrxm2ybrmv23ag9bbzcxxjr4p2q + binary-parsers: {} + wire-streams: {} + mason: + source: hackage + version: 0.2.3 + sha256: 1dcd3n1lxlpjsz92lmr1nsx29mwwglim0gask04668sdiarr3x1v + +build-tools: +- coreutils +- zlib +# moved to `custom-nix` +# - mysql57 +# - numactl + +nix-shell-tools: +- mysql57 +- zlib +# - haskellPackages.cabal-fmt +# - ghcide +# - ghcide-ghc883 + +custom-nix: + insert-binding: |- + isDarwin = super.stdenv.isDarwin; + linuxBuildTools = with super; lib.optionals (!isDarwin) [ mysql57 numactl ]; + dontCheckDarwin = + if isDarwin then super.haskell.lib.dontCheck else x: x; + + wrap-default-package: + left: |- + dontCheckDarwin (super.haskell.lib.addBuildTools ( + right: |- + ) linuxBuildTools) diff --git a/flake.lock b/flake.lock index f113539..0ad9130 100644 --- a/flake.lock +++ b/flake.lock @@ -2,233 +2,111 @@ "nodes": { "beam": { "inputs": { - "flake-parts": "flake-parts", - "haskell-flake": [ - "haskell-flake" - ], - "nixpkgs": [ - "nixpkgs" + "euler-build": [ + "euler-build" ] }, "locked": { - "lastModified": 1693307537, - "narHash": "sha256-C6THtub1VT/wskS39f1dtkJsTV0sKtVYMJu8k8tJg2w=", - "owner": "pranav-parashar2012", - "repo": "beam", - "rev": "3518c3fb226bc0b0751e55d6e7b10618c4eb250d", - "type": "github" - }, - "original": { - "owner": "pranav-parashar2012", - "ref": "Delete-with-limit-support", - "repo": "beam", - "type": "github" - } - }, - "bytestring-lexing": { - "flake": false, - "locked": { - "lastModified": 1596188445, - "narHash": "sha256-n/5kFb5msE8NPQZf6bsm8MQh0RGDoOx6EJXoji6FPMs=", + "lastModified": 1689755711, + "narHash": "sha256-sHjeKR+oaxd/S17DmGfAnDxu86xJFV/0mSTP9cWxB4w=", "owner": "juspay", - "repo": "bytestring-lexing", - "rev": "0a46db1139011736687cb50bbd3877d223bcb737", - "type": "github" - }, - "original": { - "owner": "juspay", - "repo": "bytestring-lexing", - "type": "github" - } - }, - "flake-parts": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib" - }, - "locked": { - "lastModified": 1690933134, - "narHash": "sha256-ab989mN63fQZBFrkk4Q8bYxQCktuHmBIBqUG1jl6/FQ=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "59cf3f1447cfc75087e7273b04b31e689a8599fb", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_2": { - "inputs": { - "nixpkgs-lib": "nixpkgs-lib_2" - }, - "locked": { - "lastModified": 1690933134, - "narHash": "sha256-ab989mN63fQZBFrkk4Q8bYxQCktuHmBIBqUG1jl6/FQ=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "59cf3f1447cfc75087e7273b04b31e689a8599fb", + "repo": "beam", + "rev": "fec10dfefab932bc2a1a6b5ee24985ac1deca943", "type": "github" }, "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" + "id": "beam", + "type": "indirect" } }, - "flake-parts_3": { + "euler-build": { "inputs": { - "nixpkgs-lib": "nixpkgs-lib_3" + "flake-utils": "flake-utils", + "nix-inclusive": "nix-inclusive", + "nixpkgs": "nixpkgs" }, "locked": { - "lastModified": 1690933134, - "narHash": "sha256-ab989mN63fQZBFrkk4Q8bYxQCktuHmBIBqUG1jl6/FQ=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "59cf3f1447cfc75087e7273b04b31e689a8599fb", - "type": "github" + "lastModified": 1611066903, + "narHash": "sha256-W6TW3VUboJeEuanClxs/ZK59Lxavq4toO9H5VlLdXTw=", + "ref": "master", + "rev": "aa20a46b6ae5d638c23fa009fb1dd9b07727ffa2", + "revCount": 27, + "type": "git", + "url": "ssh://git@ssh.bitbucket.juspay.net/jbiz/euler-build" }, "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" + "id": "euler-build", + "type": "indirect" } }, - "haskell-flake": { + "flake-utils": { "locked": { - "lastModified": 1691763544, - "narHash": "sha256-QQsSI5VXm0bBijeGSXXNf4fyw76/XmN67NGbmTCx71s=", - "owner": "srid", - "repo": "haskell-flake", - "rev": "f16e7ac05b1f22b66ef05b7fcc8a96281bb2b749", + "lastModified": 1600209923, + "narHash": "sha256-zoOWauTliFEjI++esk6Jzk7QO5EKpddWXQm9yQK24iM=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "3cd06d3c1df6879c9e41cb2c33113df10566c760", "type": "github" }, "original": { - "owner": "srid", - "repo": "haskell-flake", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } }, - "mysql-haskell": { + "nix-inclusive": { "inputs": { - "flake-parts": "flake-parts_3", - "haskell-flake": [ - "haskell-flake" - ], - "nixpkgs": [ - "nixpkgs" - ], - "word24": "word24" + "stdlib": "stdlib" }, "locked": { - "lastModified": 1692868544, - "narHash": "sha256-UY9HRnqWXv5Ud6pfBa/fPNwjauDYpgzJoLcQb4NuH7I=", - "owner": "arjunkathuria", - "repo": "mysql-haskell", - "rev": "2f4861667d19e84474700f32922c97af94f5dfc4", + "lastModified": 1604413592, + "narHash": "sha256-3cr2RRBCXNb+6Q1s3tEQiN4LjoFC8OsMSG8WuCyGe/g=", + "owner": "juspay", + "repo": "nix-inclusive", + "rev": "2ca1706029bfcf4bb7eaf17b4f32e49f436a148e", "type": "github" }, "original": { - "owner": "arjunkathuria", - "ref": "GHC-927", - "repo": "mysql-haskell", + "owner": "juspay", + "repo": "nix-inclusive", + "rev": "2ca1706029bfcf4bb7eaf17b4f32e49f436a148e", "type": "github" } }, "nixpkgs": { "locked": { - "lastModified": 1692557222, - "narHash": "sha256-TCOtZaioLf/jTEgfa+nyg0Nwq5Uc610Z+OFV75yUgGw=", - "owner": "nixos", - "repo": "nixpkgs", - "rev": "0b07d4957ee1bd7fd3bdfd12db5f361bd70175a6", - "type": "github" - }, - "original": { - "owner": "nixos", - "ref": "nixpkgs-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-lib": { - "locked": { - "dir": "lib", - "lastModified": 1690881714, - "narHash": "sha256-h/nXluEqdiQHs1oSgkOOWF+j8gcJMWhwnZ9PFabN6q0=", + "lastModified": 1607690238, + "narHash": "sha256-9QFXxj6pjmHr+950E3/gXo9cz50l0AbFCHZR5eixkXw=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "9e1960bc196baf6881340d53dccb203a951745a2", + "rev": "8006772a054ce57ca18c5955dcd6ec9a62577473", "type": "github" }, "original": { - "dir": "lib", "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-lib_2": { - "locked": { - "dir": "lib", - "lastModified": 1690881714, - "narHash": "sha256-h/nXluEqdiQHs1oSgkOOWF+j8gcJMWhwnZ9PFabN6q0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "9e1960bc196baf6881340d53dccb203a951745a2", - "type": "github" - }, - "original": { - "dir": "lib", - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, - "nixpkgs-lib_3": { - "locked": { - "dir": "lib", - "lastModified": 1690881714, - "narHash": "sha256-h/nXluEqdiQHs1oSgkOOWF+j8gcJMWhwnZ9PFabN6q0=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "9e1960bc196baf6881340d53dccb203a951745a2", - "type": "github" - }, - "original": { - "dir": "lib", - "owner": "NixOS", - "ref": "nixos-unstable", "repo": "nixpkgs", + "rev": "8006772a054ce57ca18c5955dcd6ec9a62577473", "type": "github" } }, "root": { "inputs": { "beam": "beam", - "bytestring-lexing": "bytestring-lexing", - "flake-parts": "flake-parts_2", - "haskell-flake": "haskell-flake", - "mysql-haskell": "mysql-haskell", - "nixpkgs": "nixpkgs" + "euler-build": "euler-build" } }, - "word24": { - "flake": false, + "stdlib": { "locked": { - "lastModified": 1647587255, - "narHash": "sha256-S37S10sJ45BulvpqJzlhX/J4hY7cW5jLM9nP4xAftac=", - "owner": "winterland1989", - "repo": "word24", - "rev": "445f791e35ddc8098f05879dbcd07c41b115cb39", + "lastModified": 1590026685, + "narHash": "sha256-E5INrVvYX/P/UpcoUFDAsuHem+lsqT+/teBs9O7oc9Q=", + "owner": "manveru", + "repo": "nix-lib", + "rev": "99088cf7febcdb21afd375a335dcafa959bef3ed", "type": "github" }, "original": { - "owner": "winterland1989", - "repo": "word24", + "owner": "manveru", + "repo": "nix-lib", "type": "github" } } diff --git a/flake.nix b/flake.nix index e657dd9..bada37b 100644 --- a/flake.nix +++ b/flake.nix @@ -1,60 +1,33 @@ +# Autogenerated from euler.yaml. Do not edit. + { + description = "beam-mysql"; inputs = { - nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable"; - flake-parts.url = "github:hercules-ci/flake-parts"; - haskell-flake.url = "github:srid/haskell-flake"; - - bytestring-lexing.url = "github:juspay/bytestring-lexing"; - bytestring-lexing.flake = false; - - ## Use Juspay upstream after PR merged here https://github.com/juspay/mysql-haskell/pull/5 - mysql-haskell.url = "github:arjunkathuria/mysql-haskell/GHC-927"; - mysql-haskell.inputs.nixpkgs.follows = "nixpkgs"; - mysql-haskell.inputs.haskell-flake.follows = "haskell-flake"; - - ## Use Juspay upstream after PR merged - https://github.com/juspay/beam/pull/21 - beam.url = "github:pranav-parashar2012/beam/Delete-with-limit-support"; - beam.inputs.haskell-flake.follows = "haskell-flake"; - beam.inputs.nixpkgs.follows = "nixpkgs"; - + # Laziness of nix allows us to be lazy here and avoid resolving deps + # The downside is that most of this .follows are redundant + euler-build.inputs.beam.follows = "beam"; + beam.inputs.euler-build.follows = "euler-build"; }; - outputs = inputs@{ self, nixpkgs, flake-parts, ... }: - flake-parts.lib.mkFlake { inherit inputs; } ({ withSystem, ... }: { - systems = nixpkgs.lib.systems.flakeExposed; - imports = [ - inputs.haskell-flake.flakeModule + outputs = flakeInputs@{ self, euler-build, ... }: + euler-build.mkEulerFlake { + overlayPath = ./nix/overlay.nix; + extraOverlayPaths = [ + ]; - perSystem = { self', pkgs, lib, config, ... }: { - haskellProjects.default = { - projectFlakeName = "beam-mysql"; - basePackages = pkgs.haskell.packages.ghc927; - imports = [ - inputs.beam.haskellFlakeProjectModules.output - inputs.mysql-haskell.haskellFlakeProjectModules.output - ]; - - packages = { - bytestring-lexing.source = inputs.bytestring-lexing; - }; - - settings = { - - bytestring-lexing = { - jailbreak = true; - }; - - mysql-haskell = { - check = false; - }; - - beam-mysql = { - jailbreak = true; - }; - - }; - autoWire = [ "packages" "checks" "devShells" "apps"]; - }; + mkConfig = { nixpkgs }: { + flakeName = "beam-mysql"; + defaultPackageName = "beam-mysql"; + exportPackages = [ + "beam-mysql" + ]; + shellTools = with nixpkgs; [ + mysql57 + zlib + ]; + # shellAttrs = { + # }; }; - }); + inputs = flakeInputs; + }; } diff --git a/nix/custom-haskell-overlay.nix b/nix/custom-haskell-overlay.nix new file mode 100644 index 0000000..b7925a9 --- /dev/null +++ b/nix/custom-haskell-overlay.nix @@ -0,0 +1,10 @@ +# Autogenerated from euler.yaml. Do not edit. + +self: super: +let + +in +super.eulerBuild.mkEulerHaskellOverlay self super +(hself: hsuper: { + beam = super.eulerBuild.keepOnlyBuildInputs hsuper.beam; +}) \ No newline at end of file diff --git a/nix/euler-gen-info b/nix/euler-gen-info new file mode 100644 index 0000000..326c6e1 --- /dev/null +++ b/nix/euler-gen-info @@ -0,0 +1,3 @@ +# euler.yaml: +# hash: c78c6b6b2f854636217160597e6a5585aeb9a93743ef12a2ec3bd6f952362e95 +# time: 2021-01-24 20:57:15.828925 \ No newline at end of file diff --git a/nix/overlay.nix b/nix/overlay.nix new file mode 100644 index 0000000..40aeb80 --- /dev/null +++ b/nix/overlay.nix @@ -0,0 +1,70 @@ +# Autogenerated from euler.yaml. Do not edit. + +self: super: +let + beam-mysql-src = super.eulerBuild.allowedPaths { + root = ./..; + paths = [ + ../src + ../test + ../db + ../pool + ../beam-mysql.cabal + ../LICENSE + ]; + }; + + bytestring-lexing-repo = builtins.fetchTarball { + url = "https://github.com/juspay/bytestring-lexing/archive/0a46db1139011736687cb50bbd3877d223bcb737.tar.gz"; + sha256 = "1jrwhlp8xs4m21xfr843278j3i7h4sxyjpq67l6lzc36pqan9zlz"; + }; + bytestring-lexing-path = bytestring-lexing-repo; + + mysql-haskell-repo = builtins.fetchTarball { + url = "https://github.com/aravindgopall/mysql-haskell/archive/55348ea51ad1070d951f35408ebc391dbbf0ec75.tar.gz"; + sha256 = "0f00dmhpbqm5hy76nrz9mzz7nnrxm2ybrmv23ag9bbzcxxjr4p2q"; + }; + mysql-haskell-path = mysql-haskell-repo; + + isDarwin = super.stdenv.isDarwin; +linuxBuildTools = with super; lib.optionals (!isDarwin) [ mysql57 numactl ]; +dontCheckDarwin = + if isDarwin then super.haskell.lib.dontCheck else x: x; +in +super.eulerBuild.mkEulerHaskellOverlay self super + (hself: hsuper: { + record-dot-preprocessor = self.eulerBuild.fastBuildExternal { + drv = super.haskell.lib.unmarkBroken (hself.callHackageDirect { + pkg = "record-dot-preprocessor"; + ver = "0.2.7"; + sha256 = "0dyn5wpn0p4sc1yw4zq9awrl2aa3gd3jamllfxrg31v3i3l6jvbw"; + } { }); + }; + bytestring-lexing = self.eulerBuild.fastBuildExternal { + drv = super.haskell.lib.unmarkBroken (hself.callCabal2nix "bytestring-lexing" bytestring-lexing-path { }); + }; + mysql-haskell = self.eulerBuild.fastBuildExternal { + drv = super.haskell.lib.unmarkBroken (hself.callCabal2nix "mysql-haskell" mysql-haskell-path { }); + }; + binary-parsers = self.eulerBuild.fastBuildExternal { + drv = super.haskell.lib.unmarkBroken (hsuper.binary-parsers); + }; + wire-streams = self.eulerBuild.fastBuildExternal { + drv = super.haskell.lib.unmarkBroken (hsuper.wire-streams); + }; + mason = self.eulerBuild.fastBuildExternal { + drv = super.haskell.lib.unmarkBroken (hself.callHackageDirect { + pkg = "mason"; + ver = "0.2.3"; + sha256 = "1dcd3n1lxlpjsz92lmr1nsx29mwwglim0gask04668sdiarr3x1v"; + } { }); + }; + + beam-mysql = dontCheckDarwin (super.haskell.lib.addBuildTools (self.eulerBuild.fastBuild { + drv = super.haskell.lib.addBuildTools (hself.callCabal2nix "beam-mysql" beam-mysql-src { }) (with self; [ coreutils zlib ]); + overrides = { + # We want to run tests for our packages most of the time + runTests = true; + }; + }) linuxBuildTools); + }) diff --git a/src/Database/Beam/MySQL/Syntax/Render.hs b/src/Database/Beam/MySQL/Syntax/Render.hs index d88a0ea..5544845 100644 --- a/src/Database/Beam/MySQL/Syntax/Render.hs +++ b/src/Database/Beam/MySQL/Syntax/Render.hs @@ -178,13 +178,13 @@ renderFrom fs = case fs of pure $ src <> hdr InnerJoin{} -> do (l, r, c) <- renderJoinParts fs.leftArg fs.rightArg fs.condition - pure $ l <> " JOIN " <> r <> maybe "" (" ON " <>) c + pure $ l <> " JOIN " <> r <> fold c LeftJoin{} -> do (l, r, c) <- renderJoinParts fs.leftArg fs.rightArg fs.condition - pure $ l <> " LEFT JOIN " <> r <> maybe "" (" ON " <>) c + pure $ l <> " LEFT JOIN " <> r <> fold c RightJoin{} -> do (l, r, c) <- renderJoinParts fs.leftArg fs.rightArg fs.condition - pure $ l <> " RIGHT JOIN " <> r <> maybe "" (" ON " <>) c + pure $ l <> " RIGHT JOIN " <> r <> fold c renderJoinParts :: MySQLFromSyntax -> From a77c9cf8339dde3a52f45e462fe6462e5e361ba1 Mon Sep 17 00:00:00 2001 From: Rahul J Date: Fri, 23 May 2025 13:32:50 +0530 Subject: [PATCH 5/5] JSON_Valid and JSON_Extract support addition --- src/Database/Beam/MySQL/Extra.hs | 1 + src/Database/Beam/MySQL/Syntax/Render.hs | 9 +++++++++ src/Database/Beam/MySQL/Syntax/Select.hs | 15 ++++++++++++++- 3 files changed, 24 insertions(+), 1 deletion(-) 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/Render.hs b/src/Database/Beam/MySQL/Syntax/Render.hs index 0b307ae..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 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