Hello,
I've noticed strange behavior using Interactive SQL. I've made a sample script to reproduce the issue. Firstly, we have to create a table and a function that updates that table:
CREATE TABLE IF NOT EXISTS _tmp_t ( t_id INTEGER PRIMARY KEY DEFAULT AUTOINCREMENT, t_time TIMESTAMP ); CREATE OR REPLACE FUNCTION _sp_update_tmp_t() RETURNS INTEGER NOT DETERMINISTIC BEGIN UPDATE _tmp_t SET t_time = CURRENT TIMESTAMP; RETURN 1; END;
Then insert one record:
INSERT INTO _tmp_t (t_time) VALUES (CURRENT TIMESTAMP); COMMIT;
Then check and remember the newly inserted value:
SELECT * FROM _tmp_t;
Next, try to update the value by calling the function that we created above:
SELECT _sp_update_tmp_t(); COMMIT;
Surprisingly (at least, to me), the value is still the same. But if I try to call the function without a COMMIT and then COMMIT separately, the value changes as expected. Also, the value changes if I remove the semicolon after the function call (before the COMMIT):
SELECT _sp_update_tmp_t() COMMIT;
Can such behavior be explained somehow or is it a bug?
Server (and client): SA16 latest EBF (1691), the same behavior with SA12 and SA11 (not latest EBFs). Platform: Windows.
Thanks.
Request clarification before answering.
Please doublecheck your testing method... I can't repeat your results with 16.0.0.1691 or 12.0.1.3298
CREATE TABLE IF NOT EXISTS _tmp_t (
t_id INTEGER PRIMARY KEY DEFAULT AUTOINCREMENT,
t_time TIMESTAMP
);
CREATE OR REPLACE FUNCTION _sp_update_tmp_t()
RETURNS INTEGER
NOT DETERMINISTIC
BEGIN
UPDATE _tmp_t SET t_time = CURRENT TIMESTAMP;
RETURN 1;
END;
INSERT INTO _tmp_t (t_time) VALUES (CURRENT TIMESTAMP);
COMMIT;
SELECT 'first', * FROM _tmp_t;
WAITFOR DELAY '00:00:01';
SELECT _sp_update_tmp_t();
COMMIT;
SELECT 'second', * FROM _tmp_t;
'first' t_id t_time
------- ----------- -----------------------
first 1 2014-01-16 09:06:18.803
_sp_update_tmp_t()
------------------
1
'second' t_id t_time
-------- ----------- -----------------------
second 1 2014-01-16 09:06:19.896
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
Testing in Your way, my result is different than yours. The code:
DROP TABLE IF EXISTS _tmp_t; CREATE TABLE _tmp_t ( t_id INTEGER PRIMARY KEY DEFAULT AUTOINCREMENT, t_time TIMESTAMP ); CREATE OR REPLACE FUNCTION _sp_update_tmp_t() RETURNS INTEGER NOT DETERMINISTIC BEGIN UPDATE _tmp_t SET t_time = CURRENT TIMESTAMP; RETURN 1; END; INSERT INTO _tmp_t (t_time) VALUES (CURRENT TIMESTAMP); COMMIT; DROP TABLE IF EXISTS #tmp; DECLARE LOCAL TEMPORARY TABLE #tmp (t_number INTEGER, t_time TIMESTAMP) NOT TRANSACTIONAL; INSERT INTO #tmp (t_number, t_time) SELECT 1, t_time FROM _tmp_t; WAITFOR DELAY '00:00:05'; SELECT _sp_update_tmp_t(); COMMIT; INSERT INTO #tmp (t_number, t_time) SELECT 2, t_time FROM _tmp_t; SELECT * from #tmp ORDER BY t_number
The result:
t_number,t_time
1,'2014.01.16 17:09:40.546'
2,'2014.01.16 17:09:40.546'
Tried in newly created 16.0.0.1691 database.
| User | Count |
|---|---|
| 5 | |
| 4 | |
| 4 | |
| 3 | |
| 2 | |
| 2 | |
| 2 | |
| 2 | |
| 2 | |
| 2 |
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.