Adds CDB_Unique_Column_Identifier for columns 173

This commit is contained in:
Guido Fioravantti 2015-10-22 17:01:47 +02:00
parent 0d1ba2538b
commit 8479c3375b
3 changed files with 87 additions and 101 deletions

View File

@ -469,7 +469,7 @@ END;
$$ LANGUAGE 'plpgsql'; $$ LANGUAGE 'plpgsql';
-- DEPRECATED: Use cartodb.CDB_Unique_Identifier since it's UTF8 Safe and length -- DEPRECATED: Use cartodb.CDB_Unique_Column_Identifier since it's UTF8 Safe and length
-- aware. Find a unique column name in the given relation, starting from the -- aware. Find a unique column name in the given relation, starting from the
-- column name given. If the column name is already unique, just return it; -- column name given. If the column name is already unique, just return it;
-- otherwise, append an increasing integer until you find a unique variant. -- otherwise, append an increasing integer until you find a unique variant.
@ -592,7 +592,7 @@ BEGIN
PERFORM _CDB_SQL( PERFORM _CDB_SQL(
Format('ALTER TABLE %s RENAME COLUMN %s TO %I', Format('ALTER TABLE %s RENAME COLUMN %s TO %I',
reloid::text, rec.attname, reloid::text, rec.attname,
cartodb.CDB_Unique_Identifier(NULL, reloid::text, '_' || const.pkey)), cartodb.CDB_Unique_Column_Identifier(NULL, const.pkey, NULL, reloid)),
'_CDB_Has_Usable_Primary_ID'); '_CDB_Has_Usable_Primary_ID');
END IF; END IF;
@ -609,7 +609,7 @@ BEGIN
PERFORM _CDB_SQL( PERFORM _CDB_SQL(
Format('ALTER TABLE %s RENAME COLUMN %s TO %I', Format('ALTER TABLE %s RENAME COLUMN %s TO %I',
reloid::text, rec.attname, cartodb.CDB_Unique_Identifier(NULL, reloid::text, '_' || const.pkey)), reloid::text, rec.attname, cartodb.CDB_Unique_Column_Identifier(NULL, const.pkey, NULL, reloid)),
'_CDB_Has_Usable_Primary_ID'); '_CDB_Has_Usable_Primary_ID');
END IF; END IF;
@ -775,7 +775,7 @@ BEGIN
WHEN others THEN WHEN others THEN
IF SQLERRM = 'parse error - invalid geometry' THEN IF SQLERRM = 'parse error - invalid geometry' THEN
text_geom_column := false; text_geom_column := false;
str := cartodb.CDB_Unique_Identifier(NULL, reloid::text, '_' || r1.attname); str := cartodb.CDB_Unique_Column_Identifier(NULL, r1.attname, NULL, reloid);
sql := Format('ALTER TABLE %s RENAME COLUMN %s TO %I', reloid::text, r1.attname, str); sql := Format('ALTER TABLE %s RENAME COLUMN %s TO %I', reloid::text, r1.attname, str);
PERFORM _CDB_SQL(sql,'_CDB_Has_Usable_Geom'); PERFORM _CDB_SQL(sql,'_CDB_Has_Usable_Geom');
RAISE DEBUG 'CDB(_CDB_Has_Usable_Geom): %', RAISE DEBUG 'CDB(_CDB_Has_Usable_Geom): %',
@ -787,7 +787,7 @@ BEGIN
-- Just change its name so we can write a new column into that name. -- Just change its name so we can write a new column into that name.
ELSE ELSE
str := cartodb.CDB_Unique_Identifier(NULL, reloid::text, '_' || r1.attname); str := cartodb.CDB_Unique_Column_Identifier(NULL, r1.attname, NULL, reloid);
sql := Format('ALTER TABLE %s RENAME COLUMN %s TO %I', reloid::text, r1.attname, str); sql := Format('ALTER TABLE %s RENAME COLUMN %s TO %I', reloid::text, r1.attname, str);
PERFORM _CDB_SQL(sql,'_CDB_Has_Usable_Geom'); PERFORM _CDB_SQL(sql,'_CDB_Has_Usable_Geom');
RAISE DEBUG 'CDB(_CDB_Has_Usable_Geom): %', RAISE DEBUG 'CDB(_CDB_Has_Usable_Geom): %',

View File

@ -20,7 +20,7 @@ BEGIN
relname := CDB_Octet_Trim(relname, usedspace + octet_length(relname) - maxlen); relname := CDB_Octet_Trim(relname, usedspace + octet_length(relname) - maxlen);
IF relname = '' THEN IF relname = '' THEN
PERFORM _CDB_Error('prefixes are to long to generate a valid identifier', '_CDB_Unique_Identifier'); PERFORM _CDB_Error('prefixes are to long to generate a valid identifier', 'CDB_Unique_Identifier');
END IF; END IF;
ident := coalesce(prefix, '') || relname || coalesce(suffix, ''); ident := coalesce(prefix, '') || relname || coalesce(suffix, '');
@ -52,10 +52,71 @@ BEGIN
i := i + 1; i := i + 1;
END LOOP; END LOOP;
PERFORM _CDB_Error('looping too far', '_CDB_Unique_Identifier'); PERFORM _CDB_Error('looping too far', 'CDB_Unique_Identifier');
END; END;
$$ LANGUAGE 'plpgsql'; $$ LANGUAGE 'plpgsql';
-- UTF8 safe and lenght aware. Find a unique identifier for a column with a given prefix
-- and/or suffix and withing a realtion. If no reloid is give, all relations are examined
CREATE OR REPLACE FUNCTION cartodb.CDB_Unique_Column_Identifier(prefix TEXT, relname TEXT, suffix TEXT, reloid REGCLASS DEFAULT NULL)
RETURNS TEXT
AS $$
DECLARE
rec RECORD;
usedspace INTEGER;
ident TEXT;
i INTEGER;
origident TEXT;
maxlen INTEGER;
BEGIN
maxlen := 63;
usedspace := 3;
usedspace := usedspace + coalesce(octet_length(prefix), 0);
usedspace := usedspace + coalesce(octet_length(suffix), 0);
relname := CDB_Octet_Trim(relname, usedspace + octet_length(relname) - maxlen);
IF relname = '' THEN
PERFORM _CDB_Error('prefixes are to long to generate a valid identifier', 'CDB_Unique_Identifier');
END IF;
ident := coalesce(prefix, '') || relname || coalesce(suffix, '');
i := 0;
origident := ident;
WHILE i < 100 LOOP
IF reloid IS NOT NULL THEN
SELECT a.attname
INTO rec
FROM pg_class c
JOIN pg_attribute a ON a.attrelid = c.oid
WHERE NOT a.attisdropped
AND a.attnum > 0
AND c.oid = reloid
AND a.attname = ident;
ELSE
SELECT a.attname
INTO rec
FROM pg_class c
JOIN pg_attribute a ON a.attrelid = c.oid
WHERE NOT a.attisdropped
AND a.attnum > 0
AND a.attname = ident;
END IF;
IF NOT FOUND THEN
RETURN ident;
END IF;
ident := origident || '_' || i;
i := i + 1;
END LOOP;
PERFORM _CDB_Error('looping too far', 'CDB_Unique_Column_Identifier');
END;
$$ LANGUAGE 'plpgsql';
-- Trims the end of a given string by the given number of octets taking care -- Trims the end of a given string by the given number of octets taking care
-- not to leave characters in half. UTF8 safe. -- not to leave characters in half. UTF8 safe.

View File

@ -1,102 +1,27 @@
cdb_unique_identifier relname
----------------------- prefix_relname
relname relname_suffix
(1 row) largolargolargolargolargolargolargolargolargolargolargolargo
prefix_largolargolargolargolargolargolargolargolargolargolar
cdb_unique_identifier
-----------------------
prefix_relname
(1 row)
cdb_unique_identifier
-----------------------
relname_suffix
(1 row)
cdb_unique_identifier
--------------------------------------------------------------
largolargolargolargolargolargolargolargolargolargolargolargo
(1 row)
cdb_unique_identifier
--------------------------------------------------------------
prefix_largolargolargolargolargolargolargolargolargolargolar
(1 row)
CREATE TABLE CREATE TABLE
cdb_unique_identifier prefix_largolargolargolargolargolargolargolargolargolargolar_0
----------------------------------------------------------------
prefix_largolargolargolargolargolargolargolargolargolargolar_0
(1 row)
DROP TABLE DROP TABLE
cdb_unique_identifier largolargolargolargolargolargolargolargolargolargolar_suffix
--------------------------------------------------------------
largolargolargolargolargolargolargolargolargolargolar_suffix
(1 row)
CREATE TABLE CREATE TABLE
cdb_unique_identifier largolargolargolargolargolargolargolargolargolargolar_suffix_0
----------------------------------------------------------------
largolargolargolargolargolargolargolargolargolargolar_suffix_0
(1 row)
DROP TABLE DROP TABLE
cdb_unique_identifier piraña
----------------------- prefix_piraña
piraña piraña_suffix
(1 row) piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpiñaácid
prefix_piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpi
cdb_unique_identifier
-----------------------
prefix_piraña
(1 row)
cdb_unique_identifier
-----------------------
piraña_suffix
(1 row)
cdb_unique_identifier
--------------------------------------------------
piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpiñaácid
(1 row)
cdb_unique_identifier
---------------------------------------------------
prefix_piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpi
(1 row)
CREATE TABLE CREATE TABLE
cdb_unique_identifier prefix_piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpi_0
-----------------------------------------------------
prefix_piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpi_0
(1 row)
DROP TABLE DROP TABLE
cdb_unique_identifier piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpi_suffix
---------------------------------------------------
piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpi_suffix
(1 row)
CREATE TABLE CREATE TABLE
cdb_unique_identifier piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpi_suffix_0
-----------------------------------------------------
piñaácidpiñaácidpiñaácidpiñaácidpiñaácidpi_suffix_0
(1 row)
DROP TABLE DROP TABLE
cdb_octet_trim pirañ
---------------- pira
pirañ pira
(1 row)
cdb_octet_trim
----------------
pira
(1 row)
cdb_octet_trim
----------------
pira
(1 row)