The new syntax looks great, and I’m really excited to see this coming together.
One piece of feedback on the proposed syntax is around the use of “=“ as a
declaration in addition to its current use as an equality operator in a WHERE
clause and an assignment operator in an UPDATE:
BEGIN TRANSACTION
LET car_miles = miles_driven, car_is_running = is_running FROM cars WHERE
model=’pinto’
LET user_miles = miles_driven FROM users WHERE name=’blake’
SELECT something else from some other table
IF NOT car_is_running THEN ABORT
UPDATE users SET miles_driven = user_miles + 30 WHERE name='blake';
UPDATE cars SET miles_driven = car_miles + 30 WHERE model='pinto';
COMMIT TRANSACTION
This is supported in languages like PL/pgSQL, but in a normal SQL query kind of
local declaration is often expressed as an alias (SELECT col AS new_col),
subquery alias (SELECT col) t, or common table expression (WITH t AS (SELECT
col)).
Here’s an example of an alternative to the proposed syntax that I’d find more
readable:
BEGIN TRANSACTION
WITH car_miles, car_is_running AS (SELECT miles_driven, is_running FROM cars
WHERE model=’pinto’),
user_miles AS (SELECT miles_driven FROM users WHERE name=’blake’)
IF NOT car_is_running THEN ABORT
UPDATE users SET miles_driven = user_miles + 30 WHERE name='blake';
UPDATE cars SET miles_driven = car_miles + 30 WHERE model='pinto';
COMMIT TRANSACTION
There’s also the option of naming the transaction like a subquery, and
supporting LET via AS (this one I’m less sure about but wanted to propose
anyway):
BEGIN TRANSACTION t1
SELECT miles_driven AS t1.car_miles, is_running AS t1.car_is_running FROM
cars WHERE model=’pinto’;
SELECT miles_driven AS t1.user_miles FROM users WHERE name=’blake’;
IF NOT car_is_running THEN ABORT
UPDATE users SET miles_driven = user_miles + 30 WHERE name='blake';
UPDATE cars SET miles_driven = car_miles + 30 WHERE model='pinto';
COMMIT TRANSACTION
This also has the benefit of resolving ambiguity in case of naming conflicts
with existing (or future) column names.
--
Abe