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 19 days ago.

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

0%

Resolution:
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 11 months 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 🌻 11 months 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 11 months ago

  • Status changed from Nouveau to En cours

#4 Updated by b b 3 months ago

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

#5 Updated by b b 19 days 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 19 days 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

Also available in: Atom PDF