J'ai une table héritée avec une expression par défaut dans un projet Rails. Cette expression sélectionne un nombre aléatoire à quatre chiffres et le convertit en chaîne. Au cours de mes tests, je suis en train de taper cette déclaration exacte dans psql pour définir l'expression par défaut:Pourquoi Postgres double-t-il le premier identificateur de fonction lorsque je définis une fonction par défaut pour une colonne?
alter table owners alter column signing_code set default
substring(to_char(((random() * ((10000 - 1))::double precision) +
(1)::double precision), '0000'::text), '....$'::text);
Puis, quand je fais \d owners
c'est ce que Postgres a décidé est mon expression par défaut réelle:
default "substring"(to_char(((random() * ((10000 - 1))::double
precision) + (1)::double precision), '0000'::text), '....$'::text)
Avis les guillemets autour du premier identificateur de fonction substring
. Cela provoque deux problèmes avec les décharges schéma Rails/charges:
- Lorsque le schéma de dumping db/schema.rb, Ruby invalide est produit parce que les guillemets doubles ne sont pas échappés
- Même si vous échappez correctement les citations par main, lors du chargement du schéma de nouveau dans la base de données, Rails définit incorrectement l'expression entière comme une valeur de chaîne par défaut, pas une expression (il entoure l'expression avec des guillemets simples)
y at-il un moyen d'obtenir Postgres pas double citation la première fonction dans l'appel de fonction imbriqué dans mon cas? Ce serait une bonne solution de contournement, sinon je vais soumettre un bug avec le projet Rails.