Inconsistence de type de colonne: character varying et character varying(30)
Bonjour,
Pour mon application, j'ai créé un fichier SQL de patch qui ajoute des colonnes à des table préalablement créées :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| CREATE OR REPLACE FUNCTION add_col(
_tbl VARCHAR, -- Table
_col VARCHAR, -- Column to add
_type regtype -- Type of that column
) RETURNS BOOL AS $$
BEGIN
-- Returns true if column has been added; false otherwise.
IF EXISTS (SELECT DISTINCT column_name
FROM information_schema.columns
WHERE table_schema LIKE current_schema and table_name LIKE _tbl and column_name LIKE _col
)
THEN
-- Column already exists in that table of that schema: do nothing.
RETURN false;
END IF;
-- Add column
EXECUTE 'ALTER TABLE ' || _tbl || ' ADD COLUMN ' || _col || ' ' || _type;
RETURN true;
END; $$ language 'plpgsql';
SELECT add_col('ack_event', 'user_name', 'VARCHAR(30)'); |
L'éxécution de ce bout de code crée une table user_name de type character varying. Si on fait un select sur ack_event on obtient:
Code:
1 2 3 4
| | id | user_name |
| bigint | character varying |
|--------+-------------------+
| | | |
En revanche si la table ack_event est créée directement avec la colonne username (de type VARCHAR(30) comme sur le patch), le type affiché dans la base est : character varying(30).
Un select donne alors :
Code:
1 2 3 4
| | id | user_name |
| bigint | character varying(30) |
|--------+-----------------------+
| | | |
Pourquoi le passage de type en argument de fonction crée cette inconsistence ? Y a-t-il un moyen de corriger ça et d'avoir character varying(30) dans tous les cas ?