fix to work on ghc 7.8.4, 7.6.3, plus small tweaks
This commit is contained in:
parent
384bf5088f
commit
2938f642d3
2
LICENSE
2
LICENSE
|
@ -1,4 +1,4 @@
|
||||||
Copyright (c) 2013, Jake Wheat
|
Copyright (c) 2013, 2014, 2015, Jake Wheat
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,10 @@ version: 0.5.0
|
||||||
synopsis: A parser for SQL.
|
synopsis: A parser for SQL.
|
||||||
|
|
||||||
description: A parser for SQL. Parses most SQL:2011
|
description: A parser for SQL. Parses most SQL:2011
|
||||||
queries, DML, schema/DDL, transaction control,
|
queries, non-query DML, DDL, access control,
|
||||||
session and access control. Please see the
|
transaction management and session management
|
||||||
homepage for more information
|
syntax. Please see the homepage for more
|
||||||
|
information
|
||||||
<http://jakewheat.github.io/simple-sql-parser/>.
|
<http://jakewheat.github.io/simple-sql-parser/>.
|
||||||
|
|
||||||
homepage: http://jakewheat.github.io/simple-sql-parser/
|
homepage: http://jakewheat.github.io/simple-sql-parser/
|
||||||
|
@ -13,7 +14,7 @@ license: BSD3
|
||||||
license-file: LICENSE
|
license-file: LICENSE
|
||||||
author: Jake Wheat
|
author: Jake Wheat
|
||||||
maintainer: jakewheatmail@gmail.com
|
maintainer: jakewheatmail@gmail.com
|
||||||
copyright: Copyright Jake Wheat 2013, 2014
|
copyright: Copyright Jake dist/build/Tests/TestsWheat 2013, 2014, 2015
|
||||||
category: Database,Language
|
category: Database,Language
|
||||||
build-type: Simple
|
build-type: Simple
|
||||||
extra-source-files: README,LICENSE,changelog
|
extra-source-files: README,LICENSE,changelog
|
||||||
|
|
|
@ -155,6 +155,7 @@ then the fixer can be easier?
|
||||||
> import Debug.Trace
|
> import Debug.Trace
|
||||||
> import Text.Show.Pretty
|
> import Text.Show.Pretty
|
||||||
> import Data.List
|
> import Data.List
|
||||||
|
> import Control.Applicative
|
||||||
|
|
||||||
> import qualified Test.Tasty as T
|
> import qualified Test.Tasty as T
|
||||||
> import qualified Test.Tasty.HUnit as H
|
> import qualified Test.Tasty.HUnit as H
|
||||||
|
|
|
@ -215,6 +215,178 @@ Section 14 in Foundation
|
||||||
USING <table reference>
|
USING <table reference>
|
||||||
ON <search condition> <merge operation specification>
|
ON <search condition> <merge operation specification>
|
||||||
|
|
||||||
|
merge into t
|
||||||
|
using t
|
||||||
|
on a = b
|
||||||
|
merge operation specification
|
||||||
|
|
||||||
|
merge into t as u
|
||||||
|
using (table factor | joined expression)
|
||||||
|
|
||||||
|
MERGE INTO tablename USING table_reference ON (condition)
|
||||||
|
WHEN MATCHED THEN
|
||||||
|
UPDATE SET column1 = value1 [, column2 = value2 ...]
|
||||||
|
WHEN NOT MATCHED THEN
|
||||||
|
INSERT (column1 [, column2 ...]) VALUES (value1 [, value2 ...
|
||||||
|
|
||||||
|
merge into t23
|
||||||
|
using t42
|
||||||
|
on t42.id = t23.id
|
||||||
|
when matched then
|
||||||
|
update
|
||||||
|
set t23.col1 = t42.col1
|
||||||
|
when not matched then
|
||||||
|
insert (id, col1)
|
||||||
|
values (t42.id, t42.col1)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MERGE INTO TableA u
|
||||||
|
|
||||||
|
USING (SELECT b.Key1, b.ColB1, c.ColC1
|
||||||
|
|
||||||
|
FROM TableB b
|
||||||
|
|
||||||
|
INNER JOIN TableC c ON c.KeyC1 = b.KeyB1
|
||||||
|
|
||||||
|
) s
|
||||||
|
|
||||||
|
ON (u.KeyA1 = s.KeyA1)
|
||||||
|
|
||||||
|
WHEN MATCHED THEN
|
||||||
|
|
||||||
|
UPDATE SET u.ColA1 = s.ColB1, u.ColA2 = s.ColC1
|
||||||
|
|
||||||
|
|
||||||
|
MERGE INTO Department
|
||||||
|
USING NewDept AS ND
|
||||||
|
ON nd.Department_Number = Department.
|
||||||
|
Department_Number
|
||||||
|
WHEN MATCHED THEN UPDATE
|
||||||
|
SET budget_amount = nd.Budget_Amount
|
||||||
|
WHEN NOT MATCHED THEN INSERT
|
||||||
|
VALUES
|
||||||
|
(nd.Department_Number, nd.Department_
|
||||||
|
Name, nd.Budget_Amount,
|
||||||
|
nd.Manager_Employee_Number);
|
||||||
|
|
||||||
|
|
||||||
|
MERGE INTO Orders2
|
||||||
|
USING Orders3
|
||||||
|
ON ORDERS3.Order_Number = Orders2.
|
||||||
|
Order_Number
|
||||||
|
WHEN NOT MATCHED THEN INSERT
|
||||||
|
Orders3.order_number, Orders3.
|
||||||
|
invoice_number,
|
||||||
|
Orders3.customer_number, Orders3.
|
||||||
|
initial_order_date,
|
||||||
|
Orders3.invoice_date, Orders3.
|
||||||
|
invoice_amount);
|
||||||
|
|
||||||
|
MERGE INTO Orders2
|
||||||
|
USING Orders3
|
||||||
|
ON ORDERS3.Order_Number = Orders2.
|
||||||
|
Order_Number AND 1=0
|
||||||
|
WHEN NOT MATCHED THEN INSERT
|
||||||
|
(Orders3.order_number, Orders3.invoice_number,
|
||||||
|
Orders3.customer_number, Orders3.
|
||||||
|
initial_order_date,
|
||||||
|
Orders3.invoice_date, Orders3.
|
||||||
|
invoice_amount);
|
||||||
|
|
||||||
|
MERGE INTO Department
|
||||||
|
USING NewDept AS ND
|
||||||
|
ON nd.Department_Number = Department.
|
||||||
|
Department_Number
|
||||||
|
WHEN MATCHED THEN UPDATE
|
||||||
|
SET budget_amount = nd.Budget_Amount
|
||||||
|
LOGGING ALL ERRORS WITH NO LIMIT;
|
||||||
|
|
||||||
|
|
||||||
|
MERGE INTO Department
|
||||||
|
USING
|
||||||
|
(SELECT Department_Number,
|
||||||
|
department_name,
|
||||||
|
Budget_Amount,
|
||||||
|
Manager_Employee_Number
|
||||||
|
FROM NewDept
|
||||||
|
WHERE Department_Number IN
|
||||||
|
(SELECT Department_Number
|
||||||
|
FROM Employee)) AS m
|
||||||
|
ON m.Department_Number = Department.
|
||||||
|
Department_Number
|
||||||
|
WHEN MATCHED THEN UPDATE
|
||||||
|
SET budget_amount = m.Budget_Amount
|
||||||
|
WHEN NOT MATCHED THEN INSERT
|
||||||
|
(m.Department_Number, m.Department_
|
||||||
|
Name, m.Budget_Amount,
|
||||||
|
m.Manager_Employee_Number)
|
||||||
|
LOGGING ALL ERRORS WITH NO LIMIT;
|
||||||
|
|
||||||
|
|
||||||
|
MERGE INTO Customers AS c
|
||||||
|
USING Moved AS m
|
||||||
|
ON m.SSN = c.SSN
|
||||||
|
WHEN MATCHED
|
||||||
|
THEN UPDATE
|
||||||
|
SET Street = m.Street,
|
||||||
|
HouseNo = m.HouseNo,
|
||||||
|
City = m.City;
|
||||||
|
|
||||||
|
MERGE INTO CentralOfficeAccounts AS C -- Target
|
||||||
|
USING BranchOfficeAccounts AS B -- Source
|
||||||
|
ON C.account_nbr = B.account_nbr
|
||||||
|
WHEN MATCHED THEN -- On match update
|
||||||
|
UPDATE SET C.company_name = B.company_name,
|
||||||
|
C.primary_contact = B.primary_contact,
|
||||||
|
C.contact_phone = B.contact_phone
|
||||||
|
WHEN NOT MATCHED THEN -- Add missing
|
||||||
|
INSERT (account_nbr, company_name, primary_contact, contact_phone)
|
||||||
|
VALUES (B.account_nbr, B.company_name, B.primary_contact, B.contact_phone);
|
||||||
|
|
||||||
|
SELECT account_nbr, company_name, primary_contact, contact_phone
|
||||||
|
FROM CentralOfficeAccounts;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MERGE INTO CentralOfficeAccounts AS C -- Target
|
||||||
|
USING BranchOfficeAccounts AS B -- Source
|
||||||
|
ON C.account_nbr = B.account_nbr
|
||||||
|
WHEN MATCHED -- On match update
|
||||||
|
AND (C.company_name <> B.company_name -- Additional search conditions
|
||||||
|
OR C.primary_contact <> B.primary_contact
|
||||||
|
OR C.contact_phone <> B.contact_phone) THEN
|
||||||
|
UPDATE SET C.company_name = B.company_name,
|
||||||
|
C.primary_contact = B.primary_contact,
|
||||||
|
C.contact_phone = B.contact_phone
|
||||||
|
WHEN NOT MATCHED THEN -- Add missing
|
||||||
|
INSERT (account_nbr, company_name, primary_contact, contact_phone)
|
||||||
|
VALUES (B.account_nbr, B.company_name, B.primary_contact, B.contact_phone);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MERGE INTO CentralOfficeAccounts AS C -- Target
|
||||||
|
USING BranchOfficeAccounts AS B -- Source
|
||||||
|
ON C.account_nbr = B.account_nbr
|
||||||
|
WHEN MATCHED -- On match update
|
||||||
|
AND (C.company_name <> B.company_name -- Additional search conditions
|
||||||
|
OR C.primary_contact <> B.primary_contact
|
||||||
|
OR C.contact_phone <> B.contact_phone) THEN
|
||||||
|
UPDATE SET C.company_name = B.company_name,
|
||||||
|
C.primary_contact = B.primary_contact,
|
||||||
|
C.contact_phone = B.contact_phone
|
||||||
|
WHEN NOT MATCHED THEN -- Add missing
|
||||||
|
INSERT (account_nbr, company_name, primary_contact, contact_phone)
|
||||||
|
VALUES (B.account_nbr, B.company_name, B.primary_contact, B.contact_phone)
|
||||||
|
WHEN SOURCE NOT MATCHED THEN -- Delete missing from source
|
||||||
|
DELETE;
|
||||||
|
|
||||||
|
SELECT account_nbr, company_name, primary_contact, contact_phone
|
||||||
|
FROM CentralOfficeAccounts;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<merge correlation name> ::=
|
<merge correlation name> ::=
|
||||||
<correlation name>
|
<correlation name>
|
||||||
|
|
||||||
|
@ -351,6 +523,8 @@ Section 14 in Foundation
|
||||||
DECLARE LOCAL TEMPORARY TABLE <table name> <table element list>
|
DECLARE LOCAL TEMPORARY TABLE <table name> <table element list>
|
||||||
[ ON COMMIT <table commit action> ROWS ]
|
[ ON COMMIT <table commit action> ROWS ]
|
||||||
|
|
||||||
|
declare local temporary table t (a int) [on commit {preserve | delete} rows]
|
||||||
|
|
||||||
14.17 <free locator statement>
|
14.17 <free locator statement>
|
||||||
|
|
||||||
<free locator statement> ::=
|
<free locator statement> ::=
|
||||||
|
|
|
@ -14,6 +14,7 @@ indent: parse then pretty print sql
|
||||||
> import System.Exit
|
> import System.Exit
|
||||||
> import Data.List
|
> import Data.List
|
||||||
> import Text.Show.Pretty
|
> import Text.Show.Pretty
|
||||||
|
> import Control.Applicative
|
||||||
|
|
||||||
> import Language.SQL.SimpleSQL.Pretty
|
> import Language.SQL.SimpleSQL.Pretty
|
||||||
> import Language.SQL.SimpleSQL.Parser
|
> import Language.SQL.SimpleSQL.Parser
|
||||||
|
|
Loading…
Reference in a new issue