RNA
 |
- RNA in 60 seconds or less
- No complement
|

CREATE OR REPLACE FUNCTION good_rna(VARCHAR)
RETURNS BOOLEAN AS '
BEGIN
IF length(substring($1 FROM \'[^AUGC]\')) THEN
RAISE EXCEPTION \'RNA must be one of A, U, C, G\';
END IF;
RETURN true;
END;
' LANGUAGE plpgsql;
CREATE DOMAIN rnabasepair VARCHAR CHECK (good_rna(VALUE));

CREATE OR REPLACE FUNCTION dna_rna_match(dnabasepair, rnabasepair)
RETURNS BOOLEAN AS'
DECLARE
dna ALIAS FOR $1;
rna ALIAS FOR $2;
BEGIN
IF (rna = TRANSLATE(dna, \'ATCG\',\'UAGC\')) THEN
RETURN TRUE;
END IF;
RETURN FALSE;
END;
' LANGUAGE plpgsql;
oscon=> SELECT dna_rna_match('CG','GC');
rna_dna_match
---------------
t
oscon=> SELECT dna_rna_match('AA','TT');
ERROR: RNA must be one of A, U, C, G
oscon=> SELECT dna_rna_match('AA','UU');
dna_rna_match
---------------
t

CREATE OPERATOR = (
leftarg = dnabasepair,
rightarg = rnabasepair,
procedure = dna_rna_match
);

oscon=> SELECT 'CC'::dnabasepair ~ 'GG'::rnabasepair;
?column?
----------
t
oscon=> SELECT 'CC'::dnabasepair ~ 'GGA'::rnabasepair;
?column?
----------
f

CREATE OR REPLACE FUNCTION rna_dna_match(rnabasepair, dnabasepair)
RETURNS BOOLEAN AS '
SELECT dna_rna_match($2,$1);
' LANGUAGE SQL;

CREATE OPERATOR = (
leftarg = rnabasepair,
rightarg = dnabasepair,
procedure = rna_dna_match
);

CREATE OR REPLACE FUNCTION dna_binds_rna(dnabasepair, rnabasepair)
RETURNS INTEGER AS'
DECLARE
dna ALIAS FOR $1;
rna ALIAS FOR $2;
BEGIN
RETURN POSITION(rna IN TRANSLATE(dna, \'ATCG\', \'UAGC\'));
END;
' LANGUAGE plpgsql;
oscon=> SELECT dna_binds_rna('AATTCC','GGG');
dna_binds_rna
---------------
0
oscon=> SELECT dna_binds_rna('AATTCC','G');
dna_binds_rna
---------------
5

CREATE OPERATOR =~ (
leftarg = dnabasepair,
rightarg = rnabasepair,
procedure = dna_binds_rna
);
oscon=> SELECT 'AATTCC' =~ 'GGG';
?column?
----------
0
oscon=> SELECT 'AATTCC' =~ 'GG';
?column?
----------
5

oscon=> SELECT 'ATC' =~ '2529DF6AB8F79407E944 45B4BC9B906714964AC8';
ERROR: RNA must be one of A, U, C< or G