CREATE EXTENSION multicorn;
CREATE server multicorn_srv foreign data wrapper multicorn options (
    wrapper 'multicorn.testfdw.TestForeignDataWrapper'
);
CREATE user mapping for postgres server multicorn_srv options (usermapping 'test');
CREATE foreign table testmulticorn (
    test1 character varying,
    test2 character varying
) server multicorn_srv options (
    option1 'option1',
    test_type 'nowrite',
    tx_hook 'true'
);
insert into testmulticorn(test1, test2) VALUES ('test', 'test2');
NOTICE:  [('option1', 'option1'), ('test_type', 'nowrite'), ('tx_hook', 'true'), ('usermapping', 'test')]
NOTICE:  [('test1', 'character varying'), ('test2', 'character varying')]
NOTICE:  BEGIN
NOTICE:  ROLLBACK
ERROR:  Error in python: NotImplementedError
DETAIL:  This FDW does not support the writable API
update testmulticorn set test1 = 'test';
NOTICE:  BEGIN
NOTICE:  []
NOTICE:  ['test1', 'test2']
NOTICE:  ROLLBACK
ERROR:  Error in python: NotImplementedError
DETAIL:  This FDW does not support the writable API
delete from testmulticorn where test2 = 'test2 2 0';
NOTICE:  BEGIN
NOTICE:  [test2 = test2 2 0]
NOTICE:  ['test1', 'test2']
NOTICE:  ROLLBACK
ERROR:  Error in python: NotImplementedError
DETAIL:  This FDW does not support the writable API
CREATE foreign table testmulticorn_write (
    test1 character varying,
    test2 character varying
) server multicorn_srv options (
    option1 'option1',
    row_id_column 'test1',
	test_type 'returning',
    tx_hook 'true'
);
insert into testmulticorn_write(test1, test2) VALUES ('test', 'test2');
NOTICE:  [('option1', 'option1'), ('row_id_column', 'test1'), ('test_type', 'returning'), ('tx_hook', 'true'), ('usermapping', 'test')]
NOTICE:  [('test1', 'character varying'), ('test2', 'character varying')]
NOTICE:  BEGIN
NOTICE:  INSERTING: [('test1', 'test'), ('test2', 'test2')]
NOTICE:  PRECOMMIT
NOTICE:  COMMIT
update testmulticorn_write set test1 = 'test' where test1 ilike 'test1 3%';
NOTICE:  BEGIN
NOTICE:  [test1 ~~* test1 3%]
NOTICE:  ['test1', 'test2']
NOTICE:  UPDATING: test1 3 1 with [('test1', 'test'), ('test2', 'test2 1 1')]
NOTICE:  UPDATING: test1 3 4 with [('test1', 'test'), ('test2', 'test2 1 4')]
NOTICE:  UPDATING: test1 3 7 with [('test1', 'test'), ('test2', 'test2 1 7')]
NOTICE:  UPDATING: test1 3 10 with [('test1', 'test'), ('test2', 'test2 1 10')]
NOTICE:  UPDATING: test1 3 13 with [('test1', 'test'), ('test2', 'test2 1 13')]
NOTICE:  UPDATING: test1 3 16 with [('test1', 'test'), ('test2', 'test2 1 16')]
NOTICE:  UPDATING: test1 3 19 with [('test1', 'test'), ('test2', 'test2 1 19')]
NOTICE:  PRECOMMIT
NOTICE:  COMMIT
delete from testmulticorn_write where test2 = 'test2 2 0';
NOTICE:  BEGIN
NOTICE:  [test2 = test2 2 0]
NOTICE:  ['test1', 'test2']
NOTICE:  DELETING: test1 1 0
NOTICE:  PRECOMMIT
NOTICE:  COMMIT
-- Test returning
insert into testmulticorn_write(test1, test2) VALUES ('test', 'test2') RETURNING test1;
NOTICE:  BEGIN
NOTICE:  INSERTING: [('test1', 'test'), ('test2', 'test2')]
NOTICE:  PRECOMMIT
NOTICE:  COMMIT
     test1      
----------------
 INSERTED: test
(1 row)

update testmulticorn_write set test1 = 'test' where test1 ilike 'test1 3%' RETURNING test1;
NOTICE:  BEGIN
NOTICE:  [test1 ~~* test1 3%]
NOTICE:  ['test1', 'test2']
NOTICE:  UPDATING: test1 3 1 with [('test1', 'test'), ('test2', 'test2 1 1')]
NOTICE:  UPDATING: test1 3 4 with [('test1', 'test'), ('test2', 'test2 1 4')]
NOTICE:  UPDATING: test1 3 7 with [('test1', 'test'), ('test2', 'test2 1 7')]
NOTICE:  UPDATING: test1 3 10 with [('test1', 'test'), ('test2', 'test2 1 10')]
NOTICE:  UPDATING: test1 3 13 with [('test1', 'test'), ('test2', 'test2 1 13')]
NOTICE:  UPDATING: test1 3 16 with [('test1', 'test'), ('test2', 'test2 1 16')]
NOTICE:  UPDATING: test1 3 19 with [('test1', 'test'), ('test2', 'test2 1 19')]
NOTICE:  PRECOMMIT
NOTICE:  COMMIT
     test1     
---------------
 UPDATED: test
 UPDATED: test
 UPDATED: test
 UPDATED: test
 UPDATED: test
 UPDATED: test
 UPDATED: test
(7 rows)

delete from testmulticorn_write where test1 = 'test1 1 0' returning test2, test1;
NOTICE:  BEGIN
NOTICE:  [test1 = test1 1 0]
NOTICE:  ['test1', 'test2']
NOTICE:  DELETING: test1 1 0
NOTICE:  PRECOMMIT
NOTICE:  COMMIT
   test2   |   test1   
-----------+-----------
 test2 2 0 | test1 1 0
(1 row)

DROP foreign table testmulticorn_write;
-- Now test with another column
CREATE foreign table testmulticorn_write(
    test1 character varying,
    test2 character varying
) server multicorn_srv options (
    option1 'option1',
    row_id_column 'test2'
);
insert into testmulticorn_write(test1, test2) VALUES ('test', 'test2');
NOTICE:  [('option1', 'option1'), ('row_id_column', 'test2'), ('usermapping', 'test')]
NOTICE:  [('test1', 'character varying'), ('test2', 'character varying')]
NOTICE:  INSERTING: [('test1', 'test'), ('test2', 'test2')]
update testmulticorn_write set test1 = 'test' where test1 ilike 'test1 3%';
NOTICE:  [test1 ~~* test1 3%]
NOTICE:  ['test1', 'test2']
NOTICE:  UPDATING: test2 1 1 with [('test1', 'test'), ('test2', 'test2 1 1')]
NOTICE:  UPDATING: test2 1 4 with [('test1', 'test'), ('test2', 'test2 1 4')]
NOTICE:  UPDATING: test2 1 7 with [('test1', 'test'), ('test2', 'test2 1 7')]
NOTICE:  UPDATING: test2 1 10 with [('test1', 'test'), ('test2', 'test2 1 10')]
NOTICE:  UPDATING: test2 1 13 with [('test1', 'test'), ('test2', 'test2 1 13')]
NOTICE:  UPDATING: test2 1 16 with [('test1', 'test'), ('test2', 'test2 1 16')]
NOTICE:  UPDATING: test2 1 19 with [('test1', 'test'), ('test2', 'test2 1 19')]
delete from testmulticorn_write where test2 = 'test2 2 0';
NOTICE:  [test2 = test2 2 0]
NOTICE:  ['test2']
NOTICE:  DELETING: test2 2 0
update testmulticorn_write set test2 = 'test' where test2 = 'test2 1 1';
NOTICE:  [test2 = test2 1 1]
NOTICE:  ['test1', 'test2']
NOTICE:  UPDATING: test2 1 1 with [('test1', 'test1 3 1'), ('test2', 'test')]
DROP foreign table testmulticorn_write;
-- Now test with other types
CREATE foreign table testmulticorn_write(
    test1 date,
    test2 timestamp
) server multicorn_srv options (
    option1 'option1',
    row_id_column 'test2',
	test_type 'date'
);
insert into testmulticorn_write(test1, test2) VALUES ('2012-01-01', '2012-01-01 00:00:00');
NOTICE:  [('option1', 'option1'), ('row_id_column', 'test2'), ('test_type', 'date'), ('usermapping', 'test')]
NOTICE:  [('test1', 'date'), ('test2', 'timestamp without time zone')]
NOTICE:  INSERTING: [('test1', datetime.date(2012, 1, 1)), ('test2', datetime.datetime(2012, 1, 1, 0, 0))]
delete from testmulticorn_write where test2 > '2011-12-03';
NOTICE:  [test2 > 2011-12-03 00:00:00]
NOTICE:  ['test2']
NOTICE:  DELETING: 2011-12-03 14:30:25
update testmulticorn_write set test1 = date_trunc('day', test1) where test2 = '2011-09-03 14:30:25';
NOTICE:  [test2 = 2011-09-03 14:30:25]
NOTICE:  ['test1', 'test2']
NOTICE:  UPDATING: 2011-09-03 14:30:25 with [('test1', datetime.date(2011, 9, 2)), ('test2', datetime.datetime(2011, 9, 3, 14, 30, 25))]
DROP foreign table testmulticorn_write;
-- Test with unknown column
CREATE foreign table testmulticorn_write(
    test1 date,
    test2 timestamp
) server multicorn_srv options (
    option1 'option1',
    row_id_column 'teststuff',
	test_type 'date'
);
delete from testmulticorn_write;
NOTICE:  [('option1', 'option1'), ('row_id_column', 'teststuff'), ('test_type', 'date'), ('usermapping', 'test')]
NOTICE:  [('test1', 'date'), ('test2', 'timestamp without time zone')]
ERROR:  The rowid attribute does not exist
DROP USER MAPPING for postgres SERVER multicorn_srv;
DROP EXTENSION multicorn cascade;
NOTICE:  drop cascades to 3 other objects
DETAIL:  drop cascades to server multicorn_srv
drop cascades to foreign table testmulticorn
drop cascades to foreign table testmulticorn_write
