Contexte
La requête suivante est exécutée dans App/Library/Extraction2.php, via Extraction2::getLastPartition() :
SELECT FROM_DAYS(CAST(SUBSTRING(MIN(PARTITION_NAME), 2) AS UNSIGNED) - 1) AS partition_date
FROM information_schema.partitions
WHERE TABLE_NAME = 'ts_value_general_int' AND table_schema=database();
Chemin d'appel identifié :
Extraction2::display()
-> Extraction2::extract()
-> Extraction2::getIdVariable()
-> Extraction2::getPartition()
-> Extraction2::getLastPartition()
Problème
La requête fait MIN(PARTITION_NAME) avant d'extraire/caster la partie numérique. Le MIN est donc lexicographique sur le nom de partition complet, ce qui dépend du format exact des noms de partition.
Cela peut devenir fragile si :
- les noms ne sont pas strictement normalisés ;
- une partition non numérique comme
pmax est présente ;
- le tri alphabétique ne correspond pas au tri numérique attendu.
Proposition
À minima, comparer la partie numérique castée plutôt que le nom brut :
SELECT FROM_DAYS(MIN(CAST(SUBSTRING(PARTITION_NAME, 2) AS UNSIGNED)) - 1) AS partition_date
FROM information_schema.partitions
WHERE TABLE_NAME = 'ts_value_general_int'
AND table_schema = DATABASE()
AND PARTITION_NAME IS NOT NULL
AND PARTITION_NAME REGEXP '^p[0-9]+$';
Si les tables sont partitionnées en RANGE (TO_DAYS(...)), une version encore plus robuste serait d'utiliser PARTITION_DESCRIPTION, qui représente la borne réelle de partition :
SELECT FROM_DAYS(MIN(CAST(PARTITION_DESCRIPTION AS UNSIGNED)) - 1) AS partition_date
FROM information_schema.partitions
WHERE TABLE_NAME = 'ts_value_general_int'
AND table_schema = DATABASE()
AND PARTITION_NAME IS NOT NULL
AND PARTITION_DESCRIPTION <> 'MAXVALUE';
À vérifier
- Confirmer que
ts_value_general_int utilise bien des partitions de type p<TO_DAYS(date)+1>.
- Ajouter un test de non-régression avec au moins
p739000, p739001 et pmax.
- Vérifier si d'autres chemins utilisent la même convention de calcul de partition dans
Extraction2.
Contexte
La requête suivante est exécutée dans
App/Library/Extraction2.php, viaExtraction2::getLastPartition():Chemin d'appel identifié :
Problème
La requête fait
MIN(PARTITION_NAME)avant d'extraire/caster la partie numérique. LeMINest donc lexicographique sur le nom de partition complet, ce qui dépend du format exact des noms de partition.Cela peut devenir fragile si :
pmaxest présente ;Proposition
À minima, comparer la partie numérique castée plutôt que le nom brut :
Si les tables sont partitionnées en
RANGE (TO_DAYS(...)), une version encore plus robuste serait d'utiliserPARTITION_DESCRIPTION, qui représente la borne réelle de partition :À vérifier
ts_value_general_intutilise bien des partitions de typep<TO_DAYS(date)+1>.p739000,p739001etpmax.Extraction2.