Data Processing
Data Processing
BRUCE MOMJIAN
May, 2013
Welcome to the
next generation
of data storage.
1. SQL
2. Functions and Triggers
3. Customizing Database Features
Change the
database features.
BEGIN;
LOCK tab;
SELECT ... WHERE col = key;
if not found
INSERT (or UPDATE)
COMMIT;
if (col != NULL)
INSERT/UPDATE;
UNIQUE
NOT NULL
CREATE TABLE customer (id INTEGER PRIMARY KEY);
BEGIN;
SELECT *
FROM primary
WHERE key = col
FOR UPDATE;
if found
INSERT (or UPDATE) INTO foreign;
COMMIT;
BEGIN;
SELECT *
FROM foreign
WHERE col = key
FOR UPDATE;
if found
?
UPDATE/DELETE primary;
COMMIT;
BEGIN;
SELECT ...
FROM foreign
WHERE col = key
FOR UPDATE;
IF found
ABORT;
UPDATE/DELETE primary;
COMMIT;
BEGIN;
SELECT ...
FROM foreign
WHERE col = key
FOR UPDATE;
IF found
UPDATE/DELETE foreign;
UPDATE/DELETE primary;
COMMIT;
BEGIN;
SELECT ...
FROM foreign
WHERE col = key
FOR UPDATE;
IF found
UPDATE foreign SET col = NULL;
UPDATE/DELETE primary;
COMMIT;
BEGIN;
SELECT ...
FROM foreign
WHERE col = key
FOR UPDATE;
IF found
UPDATE foreign SET col = DEFAULT;
UPDATE/DELETE primary;
COMMIT;
SELECT *
FROM tab1, tab2
WHERE tab1.col = tab2.col
UNION
SELECT *
FROM tab1
WHERE col NOT IN
(
SELECT tab2.col
FROM tab2
);
SELECT *
FROM tab1 LEFT JOIN tab2 ON tab1.col = tab2.col;
SELECT *
FROM tab1, tab2
WHERE tab1.col = tab2.col
UNION
SELECT *
FROM tab2
WHERE col NOT IN
(
SELECT tab1.col
FROM tab1
);
SELECT *
FROM tab1 RIGHT JOIN tab2 ON tab1.col = tab2.col;
SELECT *
FROM tab1, tab2
WHERE tab1.col = tab2.col
UNION
SELECT *
FROM tab1
WHERE col NOT IN
(
SELECT tab2.col
FROM tab2
)
UNION
SELECT *
FROM tab2
WHERE col NOT IN
(
SELECT tab1.col
FROM tab1
);
SELECT *
FROM tab1 FULL JOIN tab2 ON tab1.col = tab2.col;
SELECT *
FROM customer LEFT JOIN order ON customer.id = order.cust_id;
total = 0
FOREACH val IN set
total = total + val;
END FOREACH
SELECT SUM(val) FROM tab;
max = MIN_VAL;
FOREACH val IN set
if (val > max)
max = val;
END FOREACH
save = ;
total = 0;
FOREACH val IN set
if val != save and save !=
{
print save, total;
save = val;
total = 0;
}
total = total + amt;
END FOREACH
if save !=
print save, total;
save = ;
max = MIN_VAL;
FOREACH val IN set
if val != save and save !=
{
print save, max;
save = val;
max = MIN_VAL;
}
if (amt > max)
max = amt;
END FOREACH
if save !=
print save, max;
SELECT *
UNION
SELECT *
UNION
SELECT *;
SELECT *
INTERSECT
SELECT *
INTERSECT
SELECT *;
SELECT *
EXCEPT
SELECT *
EXCEPT
SELECT *;
SELECT *
LIMIT 5;
SELECT *
OFFSET 20 LIMIT 5;
Data Processing Inside PostgreSQL 49 / 88
Controlling Rows Returned
LIMIT/OFFSET Example
BEGIN;
SELECT *
FROM customer
WHERE id = 4452
FOR UPDATE;
...
UPDATE customer
SET balance = 0
WHERE id = 4452;
COMMIT; Data Processing Inside PostgreSQL 51 / 88
Temporary Tables
SELECT *
INTO TEMPORARY hold
FROM tab1, tab2, tab3
WHERE ...
SELECT col4
FROM tab;
SELECT *
FROM tab
WHERE col = ISDN;
SELECT col4
FROM tab
WHERE col = ISDN;
Atomic Changes
Atomic Visibility
Atomic Consistency
Reliability
User 1 User 2 Description
BEGIN WORK User 1 starts a transaction
UPDATE acct SET balance = balance - 100 WHERE acctno = 53224 remove 100 from an account
UPDATE acct SET balance = balance + 100 WHERE acctno = 94913 add 100 to an account
COMMIT WORK
signal()/kill()
LISTEN myevent;
NOTIFY myevent;
Gborg, http://gborg.postgresql.org/
Placing Code
Into the Database:
Server-Side Functions
SELECT factorial(10);
factorial
-----------
3628800
(1 row)
SELECT 10!;
?column?
----------
3628800
(1 row)
psql \dfS
psql \doS
Create function
Call function, manually or automatically
if cost < 2
shipping = 3.00
else if cost < 4
shipping = 5.00
else shipping = 6.00
SELECT name
FROM statename
WHERE code = AL;
SELECT getstatename(AL);
ELSE -- is DELETE
SELECT INTO statename_rec *
FROM statename
WHERE code = state_code;
IF FOUND
THEN DELETE FROM statename
WHERE code = state_code;
RETURN t;
ELSE RETURN f;
END IF;
END IF;
END IF;
END;
$$
LANGUAGE plpgsql;
SELECT change_statename(AL,Alabama);
SELECT change_statename(AL,Bermuda);
SELECT change_statename(AL,);
SELECT change_statename(AL,); -- row was already deleted
SELECT *
FROM (SELECT * FROM tab) AS tab;
SELECT *
FROM ( SELECT 1,2,3,4,5 UNION
SELECT 6,7,8,9,10 UNION
SELECT 11,12,13,14,15) AS tab15;
col| col| col| col| col
---+----+----+----+----
1 | 2 | 3 | 4 | 5
6 | 7 | 8 | 9 | 10
11 | 12 | 13 | 14 | 15
(3 rows)
BEFORE/AFTER ROW
INSERT/UPDATE/DELETE
OLD/NEW
SQL
PL/pgSQL
PL/Perl
PL/Python
PL/Java
PL/TCL
PL/sh
C
/contrib/earthdistance
/contrib/fuzzystringmatch
/contrib/pgcrypto
Adding New
Data and Indexing
Features
CREATE FUNCTIONS in C
CREATE TYPE
CREATE OPERATOR
CREATE OPERATOR CLASS (index type)
/contrib/chkpass
/contrib/isn
/contrib/cube
/contrib/ltree
/src/backend/utils/adt
http://momjian.us/presentations