Oracle a ajouté le support de JavaScript dans MySQL

Par:
fredericmazue

ven, 05/01/2024 - 15:55

Mi-décembre 2023, Oracle a annoncé la prise en charge de JavaScript (ECMAScript 2021) dans MySQL. Grâce à cette prise en charge, les développeurs peuvent désormais écrire des programmes stockés JavaScript (fonctions et procédures) sur le serveur de base de données MySQL. Les programmes stockés sont exécutés avec le runtime GraalVM. Il est à remarquer de ce support n'est pour l'instant présenté qu'en version préliminaire dans MySQL Enterprise Edition. Ce support est également disponible dans le service cloud MySQL Heatwave sur OCI, AWS et Azure.

Selon Oracle, la prise en charge des programmes stockés JavaScript améliorera la productivité des développeurs en tirant parti du vaste écosystème. Davantage de développeurs posséderont désormais les compétences nécessaires pour écrire des programmes stockés. En d’autres termes, les organisations peuvent désormais exploiter un plus large éventail de talents en développement en utilisant l’ensemble des compétences JavaScript largement accessibles pour le développement back-end.

Définition de procédure stockée

Pour créer une procédure stockée JavaScript dans MySQL, vous pouvez utiliser une variante des mêmes instructions SQL utilisées pour les fonctions et procédures stockées traditionnelles. Par exemple :

CREATE FUNCTION gcd_js (a INT, b INT) RETURNS INT
LANGUAGE JAVASCRIPT AS $$

  let [x, y] = [Math.abs(a), Math.abs(b)];
  while(y) [x, y] = [y, x % y];
  return x;

$$;

Comme le montre l'exemple ci-dessus, le code JavaScript est intégré directement dans la définition de la fonction appelable par SQL. Les noms des arguments peuvent être référencés directement dans le code JavaScript, et lorsque la fonction est appelée, il y aura une conversion de type implicite entre les types SQL et les types JavaScript. Pour appeler des procédures stockées JavaScript, l'instruction CALL doit être utilisée, de façon similaire aux procédures stockées SQL classiques. Les paramètres d'entrée et de sortie sont pris en charge pour les procédures stockées.

Execution de code JavaScript dans des instructions SQL

Une fonction JavaScript peut être appelée à partir d'instructions SQL partout où une fonction SQL traditionnelle peut être appelée : dans les expressions SELECT, les clauses WHERE, GROUP BY et ORDER BY, les DML, les DDL, les vues et autres. Voici deux exemples d'instruction SQL qui appellent la fonction définie ci-dessus :

SELECT col1, col2, gcd_js(col1,col2)
FROM my_table
WHERE gcd_js(col1, col2) > 1
ORDER BY gcd_js(col1, col2);

CREATE TABLE gcd_table
AS SELECT gcd_js(col1,col2)
FROM my_table;

Débogage

La fonctionnalité MySQL-JavaScript expose des interfaces SQL supplémentaires pour faciliter le débogage, tandis que le programme JavaScript s'exécute dans la base de données. Par exemple, soit une procédure stockée effectuant une division :

CREATE PROCEDURE division (IN a INT, IN b INT,
OUT result DOUBLE) LANGUAGE JAVASCRIPT AS $$
  function validate(num) {
    console.log("validating input value: ", num);
    if (num === 0) throw ("Division by Zero!");
  }
  validate(b);
  result = a / b;
$$

La conversion des exceptions JavaScript en erreurs MySQL se produit de manière transparente. Les développeurs peuvent également accéder aux traces de la pile JavaScript, en plus de la sortie standard.

CALL division( 5, 0, @res);
ERROR 6000 (HY000): JavaScript> Division by Zero!

SELECT mle_session_state("stdout");
validating input value:  0

SELECT mle_session_state("stack_trace");
<js> validate(division:9:187-214)
<js> division(division:11:222-232)
<js> :anonymous(division:15:256-265)
</js></js></js>

Sécurité

En ce qui concerne la sécurité, Oracle assure que le bac à sable VM garantit que le code malveillant ne peut pas compromettre les autres modules du serveur MySQL. Chaque programme stocké est analysé et exécuté dans son propre contexte. Cette politique d'isolement ne permet pas à un programme stocké de lire ou de modifier les données ou le code d'un autre programme stocké. La génération ou la manipulation de threads à partir du code utilisateur JavaScript est restreinte et le code utilisateur JavaScript n'a pas accès à la communication réseau ou au système de fichiers.