Section 14 in Foundation > module Language.SQL.SimpleSQL.SQL2011DataManipulation (sql2011DataManipulationTests) where > import Language.SQL.SimpleSQL.TestTypes > import Language.SQL.SimpleSQL.Syntax > sql2011DataManipulationTests :: TestItem > sql2011DataManipulationTests = Group "sql 2011 data manipulation tests" > [ 14 Data manipulation 14.1 <declare cursor> <declare cursor> ::= DECLARE <cursor name> <cursor properties> FOR <cursor specification> 14.2 <cursor properties> <cursor properties> ::= [ <cursor sensitivity> ] [ <cursor scrollability> ] CURSOR [ <cursor holdability> ] [ <cursor returnability> ] <cursor sensitivity> ::= SENSITIVE | INSENSITIVE | ASENSITIVE <cursor scrollability> ::= SCROLL | NO SCROLL <cursor holdability> ::= WITH HOLD | WITHOUT HOLD <cursor returnability> ::= WITH RETURN | WITHOUT RETURN 14.3 <cursor specification> <cursor specification> ::= <query expression> [ <updatability clause> ] <updatability clause> ::= FOR { READ ONLY | UPDATE [ OF <column name list> ] } 14.4 <open statement> <open statement> ::= OPEN <cursor name> 14.5 <fetch statement> <fetch statement> ::= FETCH [ [ <fetch orientation> ] FROM ] <cursor name> INTO <fetch target list> <fetch orientation> ::= NEXT | PRIOR | FIRST | LAST | { ABSOLUTE | RELATIVE } <simple value specification> <fetch target list> ::= <target specification> [ { <comma> <target specification> }... ] 14.6 <close statement> <close statement> ::= CLOSE <cursor name> 14.7 <select statement: single row> <select statement: single row> ::= SELECT [ <set quantifier> ] <select list> INTO <select target list> <table expression> <select target list> ::= <target specification> [ { <comma> <target specification> }... ] 14.8 <delete statement: positioned> <delete statement: positioned> ::= DELETE FROM <target table> [ [ AS ] <correlation name> ] WHERE CURRENT OF <cursor name> <target table> ::= <table name> | ONLY <left paren> <table name> <right paren> 14.9 <delete statement: searched> <delete statement: searched> ::= DELETE FROM <target table> [ FOR PORTION OF <application time period name> FROM <point in time 1> TO <point in time 2> ] [ [ AS ] <correlation name> ] [ WHERE <search condition> ] > (TestStatement ansi2011 "delete from t" > $ Delete [Name Nothing "t"] Nothing Nothing) > ,(TestStatement ansi2011 "delete from t as u" > $ Delete [Name Nothing "t"] (Just (Name Nothing "u")) Nothing) > ,(TestStatement ansi2011 "delete from t where x = 5" > $ Delete [Name Nothing "t"] Nothing > (Just $ BinOp (Iden [Name Nothing "x"]) [Name Nothing "="] (NumLit "5"))) > ,(TestStatement ansi2011 "delete from t as u where u.x = 5" > $ Delete [Name Nothing "t"] (Just (Name Nothing "u")) > (Just $ BinOp (Iden [Name Nothing "u", Name Nothing "x"]) [Name Nothing "="] (NumLit "5"))) 14.10 <truncate table statement> <truncate table statement> ::= TRUNCATE TABLE <target table> [ <identity column restart option> ] <identity column restart option> ::= CONTINUE IDENTITY | RESTART IDENTITY > ,(TestStatement ansi2011 "truncate table t" > $ Truncate [Name Nothing "t"] DefaultIdentityRestart) > ,(TestStatement ansi2011 "truncate table t continue identity" > $ Truncate [Name Nothing "t"] ContinueIdentity) > ,(TestStatement ansi2011 "truncate table t restart identity" > $ Truncate [Name Nothing "t"] RestartIdentity) 14.11 <insert statement> <insert statement> ::= INSERT INTO <insertion target> <insert columns and source> <insertion target> ::= <table name> <insert columns and source> ::= <from subquery> | <from constructor> | <from default> <from subquery> ::= [ <left paren> <insert column list> <right paren> ] [ <override clause> ] <query expression> <from constructor> ::= [ <left paren> <insert column list> <right paren> ] [ <override clause> ] <contextually typed table value constructor> <override clause> ::= OVERRIDING USER VALUE | OVERRIDING SYSTEM VALUE <from default> ::= DEFAULT VALUES <insert column list> ::= <column name list> > ,(TestStatement ansi2011 "insert into t select * from u" > $ Insert [Name Nothing "t"] Nothing > $ InsertQuery makeSelect > {qeSelectList = [(Star, Nothing)] > ,qeFrom = [TRSimple [Name Nothing "u"]]}) > ,(TestStatement ansi2011 "insert into t(a,b,c) select * from u" > $ Insert [Name Nothing "t"] (Just [Name Nothing "a", Name Nothing "b", Name Nothing "c"]) > $ InsertQuery makeSelect > {qeSelectList = [(Star, Nothing)] > ,qeFrom = [TRSimple [Name Nothing "u"]]}) > ,(TestStatement ansi2011 "insert into t default values" > $ Insert [Name Nothing "t"] Nothing DefaultInsertValues) > ,(TestStatement ansi2011 "insert into t values(1,2)" > $ Insert [Name Nothing "t"] Nothing > $ InsertQuery $ Values [[NumLit "1", NumLit "2"]]) > ,(TestStatement ansi2011 "insert into t values (1,2),(3,4)" > $ Insert [Name Nothing "t"] Nothing > $ InsertQuery $ Values [[NumLit "1", NumLit "2"] > ,[NumLit "3", NumLit "4"]]) > ,(TestStatement ansi2011 > "insert into t values (default,null,array[],multiset[])" > $ Insert [Name Nothing "t"] Nothing > $ InsertQuery $ Values [[Iden [Name Nothing "default"] > ,Iden [Name Nothing "null"] > ,Array (Iden [Name Nothing "array"]) [] > ,MultisetCtor []]]) 14.12 <merge statement> <merge statement> ::= MERGE INTO <target table> [ [ AS ] <merge correlation name> ] USING <table reference> 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> ::= <correlation name> <merge operation specification> ::= <merge when clause>... <merge when clause> ::= <merge when matched clause> | <merge when not matched clause> <merge when matched clause> ::= WHEN MATCHED [ AND <search condition> ] THEN <merge update or delete specification> <merge update or delete specification> ::= <merge update specification> | <merge delete specification> <merge when not matched clause> ::= WHEN NOT MATCHED [ AND <search condition> ] THEN <merge insert specification> <merge update specification> ::= UPDATE SET <set clause list> <merge delete specification> ::= DELETE <merge insert specification> ::= INSERT [ <left paren> <insert column list> <right paren> ] [ <override clause> ] VALUES <merge insert value list> <merge insert value list> ::= <left paren> <merge insert value element> [ { <comma> <merge insert value element> }... ] <right paren> <merge insert value element> ::= <value expression> | <contextually typed value specification> 14.13 <update statement: positioned> <updatestatement: positioned> ::= UPDATE <target table> [ [ AS ] <correlation name> ] SET <set clause list> WHERE CURRENT OF <cursor name> 14.14 <update statement: searched> <update statement: searched> ::= UPDATE <target table> [ FOR PORTION OF <application time period name> FROM <point in time 1> TO <point in time 2> ] [ [ AS ] <correlation name> ] SET <set clause list> [ WHERE <search condition> ] > ,(TestStatement ansi2011 "update t set a=b" > $ Update [Name Nothing "t"] Nothing > [Set [Name Nothing "a"] (Iden [Name Nothing "b"])] Nothing) > ,(TestStatement ansi2011 "update t set a=b, c=5" > $ Update [Name Nothing "t"] Nothing > [Set [Name Nothing "a"] (Iden [Name Nothing "b"]) > ,Set [Name Nothing "c"] (NumLit "5")] Nothing) > ,(TestStatement ansi2011 "update t set a=b where a>5" > $ Update [Name Nothing "t"] Nothing > [Set [Name Nothing "a"] (Iden [Name Nothing "b"])] > $ Just $ BinOp (Iden [Name Nothing "a"]) [Name Nothing ">"] (NumLit "5")) > ,(TestStatement ansi2011 "update t as u set a=b where u.a>5" > $ Update [Name Nothing "t"] (Just $ Name Nothing "u") > [Set [Name Nothing "a"] (Iden [Name Nothing "b"])] > $ Just $ BinOp (Iden [Name Nothing "u",Name Nothing "a"]) > [Name Nothing ">"] (NumLit "5")) > ,(TestStatement ansi2011 "update t set (a,b)=(3,5)" > $ Update [Name Nothing "t"] Nothing > [SetMultiple [[Name Nothing "a"],[Name Nothing "b"]] > [NumLit "3", NumLit "5"]] Nothing) 14.15 <set clause list> <set clause list> ::= <set clause> [ { <comma> <set clause> }... ] <set clause> ::= <multiple column assignment> | <set target> <equals operator> <update source> <set target> ::= <update target> | <mutated set clause> <multiple column assignment> ::= <set target list> <equals operator> <assigned row> <set target list> ::= <left paren> <set target> [ { <comma> <set target> }... ] <right paren> <assigned row> ::= <contextually typed row value expression> <update target> ::= <object column> | <object column> <left bracket or trigraph> <simple value specification> <right bracket or trigraph> <object column> ::= <column name> <mutated set clause> ::= <mutated target> <period> <method name> <mutated target> ::= <object column> | <mutated set clause> <update source> ::= <value expression> | <contextually typed value specification> 14.16 <temporary table declaration> <temporary table declaration> ::= DECLARE LOCAL TEMPORARY TABLE <table name> <table element list> [ ON COMMIT <table commit action> ROWS ] declare local temporary table t (a int) [on commit {preserve | delete} rows] 14.17 <free locator statement> <free locator statement> ::= FREE LOCATOR <locator reference> [ { <comma> <locator reference> }... ] <locator reference> ::= <host parameter name> | <embedded variable name> | <dynamic parameter specification> 14.18 <hold locator statement> <hold locator statement> ::= HOLD LOCATOR <locator reference> [ { <comma> <locator reference> }... ] > ]