Project

General

Profile

Anomalie #4374

Sauvegarde au format SQLite impossible avec les dernières version de MariaDB

Added by Olivier Tétard over 1 year ago. Updated about 1 month ago.

Status:
Fermé
Priority:
Haut
Assignee:
-
Category:
base de données
Target version:
Start date:
08/25/2019
Due date:
% Done:

0%

Resolution:
fixed
Navigateur:

Description

Les dernières versions de MariaDB exportent utilisent current_timestamp() en tant que fonction quand on exporte le format des tables SQL (via la commande SHOW CREATE TABLE). C’est ce résultat qui est utilisé pour créer les tables dans la base SQLite, or, l’utilisation de la fonction current_timestamp() n’est pas possible avec SQLite.

Ce problème a été introduit avec les dernières version de MariaDB (voir par exemple ce rapport de bug ou cette discussion sur StackOverflow. Ce problème est par ailleurs évoqué sur les forums de SPIP, ici.

Un correctif bête et méchant est de modifier le code de SPIP pour permettre de changer l’appel à la fonction current_timestamp() vers la variable CURRENT_TIMESTAMP. Ça peut soit être fait dans le code de la fonction base_copier_table() en rajoutant le bout de code suivant ligne 604 :

        foreach($desc_source["field"] as $k => $v) {
            $desc_source["field"][$k] = str_replace("current_timestamp()", "CURRENT_TIMESTAMP", $v);
        }

(L’idéal serait de vérifier que la base de données source utilise bien la dernière version de MariaDB histoire d’éviter des appels inutiles à str_replace).

History

#1 Updated by b b over 1 year ago

  • Priority changed from Normal to Haut
  • Target version set to 3.3

Version cible 3.3 et report à faire en 3.2 + 3.1 donc.

#2 Updated by marcimat 🌻 over 1 year ago

Je dirais qu’il faut plutôt :
- soit modifier _sqlite_remplacements_definitions_table() dans ecrire/req/sqlite_generique.php
- soit déclarer une fonction current_timestamp() dans ecrire/req/sqlite_fonctions.php qui retournerait l’équivalent de la fonction php time()

#3 Updated by b b over 1 year ago

  • Status changed from Nouveau to En cours

#4 Updated by b b 8 months ago

@marcimat, tu n'as pas encore envoyé de patch pour ça ?

#5 Updated by b b 5 months ago

Un truc comme ça @marcimat ?

diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php
index 8ed38dc0a5..00d61660ee 100644
--- a/ecrire/req/sqlite_generique.php
+++ b/ecrire/req/sqlite_generique.php
@@ -2429,6 +2429,7 @@ function _sqlite_remplacements_definitions_table($query, $autoinc = false) {
         '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''",
         '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'",
         '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'",
+        '/current_timestamp\(\)/' => 'CURRENT_TIMESTAMP'
     );

     // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY

#6 Updated by b b 5 months ago

En fait non, cf :

< marcimat‎ >  mais sqlite, n’a pas ON UPDATE
< marcimat‎ >  donc DEFAULT CURRENT_TIMESTAMP => ok
< marcimat‎ >  mais si y a ON UPDATE current_timestamp()
< marcimat‎ >  on n’a aucune solution en sqlite
< marcimat‎ >  autre que de passer par des triggers (comme d’autres bdd d’ailleurs)

https://stackoverflow.com/a/50429848

#7 Updated by b b 2 months ago

À fixer avant la release de la 3.3 ?

#8 Updated by cedric - about 2 months ago

oui enfin le `ON UPDATE CURRENT_TIMESTAMP` c'est un problème pour faire tourner le Site en SQLite.
Pour faire le backup on a juste besoin que les tables soit bien créées dans sqlite pour pouvoir copier le contenu de mysql vers sqlite.
Donc je pense que le patch de b_b fait l'affaire...

#9 Updated by cedric - about 2 months ago

  • Resolution set to fixed

et https://git.spip.net/spip/spip/commit/7a30fed7bbe4bad2ae36d89bf309bc1dac08efda doit donc corriger le soucis
b_b : je l'ai remontée avant l'autre regexp sur le timestamp car sinon je pense on va rater la suppression du ON UPDATE ... justement qui va nous bloquer la creation de la table

Si tu pouvais nous faire un feedback Olivier qu'on fasse le report en 3.2 aussi ?

#10 Updated by cedric - about 1 month ago

  • Status changed from En cours to Fermé

pas de feedback, on ferme

Also available in: Atom PDF