\p CREATE TABLE Prix
CREATE CACHED TABLE "Prix"
  ( ID INTEGER GENERATED BY DEFAULT AS IDENTITY(START WITH 0) NOT NULL
  , date DATE DEFAULT CURRENT_DATE NOT NULL
  , produit INTEGER NOT NULL
  , euros DECIMAL(100,2) DEFAULT 0.00 NOT NULL
  , CONSTRAINT "PK_Prix" PRIMARY KEY(ID)
  , CONSTRAINT "FK_Prix_produit"
      FOREIGN KEY(produit)
      REFERENCES "Produit"(ID)
      ON UPDATE CASCADE
  , CONSTRAINT "La combinaison (produit, date) d'un prix doit être unique"
      UNIQUE (produit, date)
  );

DROP FUNCTION produit_maxdate IF EXISTS CASCADE;
CREATE FUNCTION produit_maxdate(IN at_date DATE)
  RETURNS TABLE(produit INTEGER, max_date DATE)
  READS SQL DATA
  BEGIN ATOMIC
    RETURN TABLE
      (SELECT "Produit".ID as produit
             , MAX( date ) as max_date
          FROM "Prix"
          JOIN "Produit" ON "Produit".ID = "Prix".produit
          WHERE date <= at_date
          GROUP BY "Produit".ID
      );
  END;
.;

DROP FUNCTION prix_à_date IF EXISTS CASCADE;
CREATE FUNCTION prix_à_date(IN at_date DATE)
  RETURNS TABLE(produit INTEGER, "DATE" DATE, euros DECIMAL)
  READS SQL DATA
  BEGIN ATOMIC
    RETURN TABLE
      (SELECT produit, date, euros
         FROM TABLE (produit_maxdate(at_date)) as P
         JOIN "Prix" ON "Prix".produit = P.produit
                    AND "Prix".date = P.max_date
      );
  END;
.;
