diff --git a/project1/c.sql b/project1/c.sql new file mode 100644 index 0000000..665d525 --- /dev/null +++ b/project1/c.sql @@ -0,0 +1,69 @@ +DROP TABLE IF EXISTS addressRelations; +CREATE TABLE addressRelations (addr1 int, addr2 int); +CREATE TEMPORARY TABLE tempRelations (addr1 int, addr2 int); +------------------------------------- +-- Tx that has more than one input +CREATE OR REPLACE VIEW joint_control_transactions +AS SELECT tx_id +FROM inputs +GROUP BY tx_id +HAVING count(*)>1; +------------------------------------- +-- Tx that pass serial control check +CREATE OR REPLACE VIEW serial_control_transactions +AS SELECT tx_id +FROM inputs +JOIN outputs +USING (tx_id) +GROUP BY tx_id +HAVING count(*)=1; +------------------------------------- +--insert joint control results (contains symmetric and reflexive results) +INSERT INTO tempRelations +SELECT inputs.sig_id, joint_tx_with_addr.sig_id +FROM inputs +RIGHT OUTER JOIN ( + SELECT tx_id, sig_id + FROM joint_control_transactions + JOIN inputs + USING (tx_id) +) +AS joint_tx_with_addr +USING (tx_id); +------------------------------------- +--insert serial control results +INSERT INTO tempRelations +SELECT sig_id, pk_id +FROM inputs +JOIN outputs +USING (tx_id) +WHERE tx_id IN (SELECT tx_id FROM serial_control_transactions); +------------------------------------- +-- clean up reflexivity +DELETE +FROM tempRelations +WHERE addr1 = addr2; +------------------------------------- +-- Temporary table for storing symmetrical rows +CREATE TEMPORARY TABLE temp_symmetry (addr1 int, addr2 int); + +-- find symmetrical rows +INSERT INTO temp_symmetry +SELECT tmp1.addr1, tmp1.addr2 +FROM tempRelations tmp1 +INNER JOIN tempRelations tmp2 +ON tmp1.addr1 = tmp2.addr2 +AND tmp1.addr2 = tmp2.addr1 +AND tmp1.addr1 > tmp1.addr2; + +-- clean up symmetrical rows +DELETE +FROM tempRelations +WHERE EXISTS (SELECT * FROM temp_symmetry WHERE tempRelations.addr1 = temp_symmetry.addr1 AND tempRelations.addr2 = temp_symmetry.addr2); + +INSERT INTO addressRelations +SELECT addr1, addr2 +FROM tempRelations; + +DROP TABLE IF EXISTS temp_symmetry; +DROP TABLE IF EXISTS tempRelations;