Titre du stage Interrogation sûre et exible de bases de données depuis OCaml Durée 2 à 3 mois Encadrant Jérôme Vouillon, laboratoire PPS, université Paris Diderot - Paris 7 & CNRS (http://www.pps.jussieu.fr/~vouillon/) Lieu du stage Laboratoire PPS (http://www.pps.jussieu.fr/) Sujet de stage Contexte L'objectif du stage est de dénir une interface permettant d'interagir de manière sûre et exible avec une base de données depuis OCaml. Plus précisement, les requêtes doivent être vériées syntaxiquement et typées à la compilation. Il doit également être possible de construire des requêtes complexes de façon modulaire, en combinant des requêtes plus simples. Généralement, l'interaction avec une base de données depuis un programme s'eectue en formulant des requêtes SQL sous la forme de chaînes de caractères. Mysql.exec db (Format.sprintf "select * from users where id = %d" id) Il n'y a pas de vérication statique que la requête soit bien-formée, ni qu'elle soit en adéquation avec le contenu de la base de donnée. Cette approche est également peu modulaire : on peut créer des requêtes complexes par concaténation de chaîne de caractères, mais le code est alors peu lisible. La bibliothèque PG'OCaml1 propose de typer les requêtes SQL. Des requêtes pouvant comporter des trous (nommés) sont envoyées lors de la compilation à la base de donnée. Celle-ci les vérie et retourne leurs types, ainsi que le type des trous. Ces types sont utilisée pour produire le code OCaml approprié. PGSQL(db) "select * from users where id = $id" On garantit ainsi que les requêtes sont bien formées et correspondent au contenu de la base de donnée. Mais, puisque les requêtes doivent être connues à la compilation, toute modularité est perdu. En pratique, on se retrouve facilement dans 1 http://developer.berlios.de/projects/pgocaml/ 1 un programme avec de multiples requêtes eectuant la même jointure entre deux tables mais sélectionnant des lignes diérentes de la table résultante. Il paraît dicile de typer des requêtes SQL de façon modulaire depuis OCaml. En particulier, pour typer une jointure select * from t1, t2 , il faudrait disposer de la concaténation de types enregistrements. Nous proposons donc de formuler les requêtes sous forme de compréhensions [1, 3, 2, 4]. { u | u <- users, u.id = id } Un tel langage a de plus de bonne propriétés algébriques et est facile à traduire vers SQL. Travail demandé Il s'agit de dénir et implémenter un langage de requête à base de compréhensions. Ce langage de requête sera déni comme une extension de syntaxe Camlp4 pour OCaml. Il doit être choisi de manière à être expressif tout en pouvant être traduit vers SQL et typé à l'aide du système de type d'OCaml. Connaissances préalables Bonne aisance dans la programmation en Caml. Références [1] Peter Buneman, Leonid Libkin, Dan Suciu, Val Tannen, and Limsoon Wong. Comprehension syntax. SIGMOD Rec., 23(1) :8796, 1994. [2] Torsten Grust, Manuel Mayr, Jan Rittinger, and Tom Schreiber. Ferry : Database-supported program execution. In Proceedings of the 28th ACM SIGMOD Int'l Conference on Management of Data, June 2009. To appear. [3] Simon Peyton Jones and Philip Wadler. Comprehensive comprehensions. In Haskell '07 : Proceedings of the ACM SIGPLAN workshop on Haskell workshop, pages 6172, New York, NY, USA, 2007. ACM. [4] Jan Van den Bussche. Simulation of the nested relational algebra by the at relational algebra, with an application to the complexity of evaluating powerset algebra expressions. Theor. Comput. Sci., 254(1-2) :363377, 2001. 2