Plateforme d’analyse basée sur Apache Spark et optimisée pour Azure.
Bonjour Nathan Eckert, merci d'avoir répondu à la FAQ Microsoft ! désolé pour la réponse tardive car cette question est ingérée un peu tard dans ma file d'attente. Comme il ne s'agit pas d'une question en anglais, veuillez excuser ma grammaire car j'utilise la fonction de traduction.
Votre problème est dû aux raisons suivantes :
Cause principale :
- IS NOT DISTINCT FROM est un opérateur d'égalité NULL-safe ; il doit traiter NULL = NULL comme TRUE.
- La condition de jointure T0.b IS NOT DISTINCT FROM T1.d de votre requête (tous deux NULL) doit être évaluée à TRUE, renvoyant la ligne de T1 (c=2, d=null).
Le fait que cela fonctionne dans Databricks Runtime 15 mais échoue dans Serverless SQL Warehouse signifie :
- Le moteur Photon ou l'optimiseur de requêtes du backend serverless présente une régression.
- Un déploiement récent a modifié la façon dont IS NOT DISTINCT FROM est compilé ou exécuté, optimisant probablement incorrectement la correspondance NULL.
Ce n'est pas la faute de votre code ; il semble qu'il s'agisse d'un bug dans la couche SQL serverless de Databricks. Ce prédicat gère explicitement les valeurs NULL en considérant deux valeurs NULL comme « non distinctes ». Il offre la même fonctionnalité que l'opérateur <=>.
Solution immédiate :
Remplacez « IS NOT DISTINCT FROM » par une logique explicite de sécurité NULL :
ON (T0.b = T1.d OR (T0.b IS NULL AND T1.d IS NULL))
Ceci est logiquement identique et fonctionnera de manière cohérente dans tous les environnements Databricks.
Comment le confirmer:
Exécutez la même requête dans :
Un entrepôt SQL Pro ou Classic (non sans serveur)
Un cluster Databricks Runtime 15 avec un point de terminaison SQL
Si cela fonctionne partout sauf sans serveur → confirme que le bug est limité à SQL sans serveur.
Références rapides :
- https://docs.databricks.com/aws/en/sql/language-manual/sql-ref-null-semantics#:~:text=Comparison%20operators%E2%80%8B,or%20both%20operands%20are%20NULL%20:
- https://learn.microsoft.com/en-us/sql/t-sql/queries/is-distinct-from-transact-sql?view=sql-server-ver17
- https://modern-sql.com/feature/is-distinct-from#:~:text=Modern%20SQL:%20IS%20DISTINCT%20FROM,if%20only%20one%20is%20null%20.
N'hésitez pas à me faire savoir si ces informations vous sont utiles. Veuillez les accepter si elles vous semblent utiles, afin d'aider les autres membres de la communauté à résoudre des problèmes similaires.
Merci
Pratyush