E' la punta di un iceberg-rogna sui tipi questa storia ...
Ho appena dato un occhio all'errore 5. C'è ancora. L'update in errore è questo:
UPDATE "j301_finder_links"
SET "route" = 'index.php?option=com_content&view=category&id=9',
"title" = 'Uncategorised',
"description" = '',
"indexdate" = NOW(),
"state" = 1,
"access" = 1,
"language" = '*',
"type_id" = 1,
"object" = 'O:19:"FinderIndexerResult":18:{s:11:"',
"publish_start_date" = '1970-01-01 00:00:00',
"publish_end_date" = '1970-01-01 00:00:00',
"start_date" = '2011-01-01 00:00:01',
"end_date" = '1970-01-01 00:00:00',
"list_price" = '',
"sale_price" = ''
WHERE link_id = 1
E l'errore è:
ERROR: invalid input syntax for type numeric: ""
LINE 15: "list_price" = '', ^
********** Errore **********
ERROR: invalid input syntax for type numeric: ""
Stato SQL: 22P02
Carattere: 674
Errore giustissimo e sacrosanto, list_price è un number, non ci puoi mettere una stringa. Mettendo uno 0 al posto dei '' l'errore si sposta su sale_price. Facendo la stessa cosa l'update viene eseguita correttamente.
Ora, ho passato la stessa update a MySQL (correggendo solo i quote) e indovina? Se l'è presa e ingoiata, tutto liscio, il '' è diventato un bello 0. Per capire da dove venisse la traduzione in 0 ho smontato gli orpelli della colonna list_price su mysql. Ho tolto il not null, l'attributo unsigned e il default a 0. Niente, mysql traduce '' in 0 da solo. Per poter mettere null nella colonna l'update deve essere "= null".
Insomma MySQL è un dbms creativo mentre postgres no (e meno male! sulla base di cosa '' diventa 0?).
E' lo stesso problema del punto 4, servito con una salsa diversa.
Mentre punto 6 è lo stesso errore, '' in list_price e list_sale.
I trigger? A naso non servono, sono a valle, il controllo sui tipi avviene a monte.
Lo so che non ci si può mettere a fare truncate a tappeto tu tutti i valori. Ma per distinguere in casi in cui fare dei controlli da quelli in cui non servono possono tornare utili queste function del driver postgres:
pg_field_type()
pg_field_prtlen()
pg_field_name()
pg_field_type_oid()