Valider 1d2db8de rédigé par esj's avatar esj
Parcourir les fichiers

#209: l'élimination d'apostrophes (exigée par PG) autour d'une constante...

#209: l'élimination d'apostrophes (exigée par PG) autour d'une constante numérque dans un critère ''col=valeur'' était mal calculé par [9859] car cette colonne n'est pas forcément dans la table de la boucle, elle peut-etre dans une table de jointure. Le code est donc reporté dans la fonction détectant le besoin de jointure pour récupérer la description de la bonne table.
parent 58b96859
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+0 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -713,7 +713,6 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile) {
				if ((!$boucles[$id]->jointures)
				AND (is_array($x = $tables_jointures[$nom_table])))
					$boucles[$id]->jointures = $x;
				spip_log("j $nom_table  $x $table");
				if (($type == 'documents') && $boucle->doublons)
					{ $descr['documents'] = true;  }
			}
+14 −13
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -723,9 +723,12 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {

	global $table_des_tables, $tables_principales, $table_date;
	global $exceptions_des_jointures, $exceptions_des_tables;
	global $table_criteres_infixes;
	$boucle = &$boucles[$idb];
	$type = $boucle->type_requete;
	$table = $boucle->id_table;
	$nom = $table_des_tables[$type];
	list(, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);

	list($fct, $col, $op, $val, $args_sql) =
	  calculer_critere_infixe_ops($idb, $boucles, $crit);
@@ -763,8 +766,6 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
		$val[0] = str_replace('image', 'vignette', $val[0]);

	else  {
		$nom = $table_des_tables[$type];
		list($nom, $desc) = trouver_def_table($nom ? $nom : $type, $boucle);
		if (@!array_key_exists($col, $desc['field'])) {
	  	$calculer_critere_externe = 'calculer_critere_externe_init';
			// gestion par les plugins des jointures tordues pas automatiques mais necessaires
@@ -775,11 +776,19 @@ function calculer_critere_infixe($idb, &$boucles, $crit) {
					list($t, $col) = $exceptions_des_jointures[$table][$col];
			}
			else if (isset($exceptions_des_jointures[$col]))
			  // on ignore la table, quel luxe!
				list($t, $col) = $exceptions_des_jointures[$col];
			else $t ='';
			else $t =''; // jointure non declaree. La trouver.
			$table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond OR $op !='='), $t);
			list($nom, $desc) = trouver_champ_exterieur($col, $boucle->jointures, $boucle);
		}
	}
	// En fonction du type de la colonne SQL
	// la valeur comparee doit etre munie ou non d'apostrophes
	if ($op == '=' OR in_array($op, $table_criteres_infixes)) {
		if (strpos($val[0], '_q(') === 0
		AND test_sql_int($desc['field'][$col]))
				$val[0] = 'intval' . substr($val[0],2);
		spip_log("typer $nom $col $idb $d $val[0]");
	}
	// tag du critere pour permettre aux boucles de modifier leurs requetes par defaut en fonction de ca
	$boucles[$idb]->modificateur['criteres'][$col] = true;
@@ -1069,7 +1078,6 @@ function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false)
// http://doc.spip.org/@calculer_critere_infixe_ops
function calculer_critere_infixe_ops($idb, &$boucles, $crit)
{
	global $table_criteres_infixes;
	// cas d'une valeur comparee a elle-meme ou son referent
	if (count($crit->param) == 0)
	  { $op = '=';
@@ -1135,13 +1143,6 @@ function calculer_critere_infixe_ops($idb, &$boucles, $crit)
	  $args_sql .= $a[2];;
	}

	if ($op == '=' OR in_array($op, $table_criteres_infixes)) {
		list($nom, $desc) = trouver_def_table($boucles[$idb]->id_table, $boucles[$idb]);
		$type = $desc['field'][$col];
		if (strpos($val[0], '_q(') === 0 AND test_sql_int($type))
			$val[0] = 'intval' . substr($val[0],2);
	}

	return array($fct, $col, $op, $val, $args_sql);
}