Skip to content

Support LANGUAGE JAVASCRIPT clause for stored functions and procedures #29

@kyleconroy

Description

@kyleconroy

Summary

MySQL 9.0 added JavaScript stored programs: CREATE FUNCTION ... LANGUAGE JAVASCRIPT AS $$ ... $$ (and same for CREATE PROCEDURE). Marino does not recognise the LANGUAGE characteristic or the $$ ... $$ body delimiter.

MySQL version

Introduced in MySQL 9.0 (community parses the syntax; the language component itself ships in MySQL Enterprise / HeatWave).

Current state in marino

grep -in 'LANGUAGE JAVASCRIPT\|JAVASCRIPT' parser/parser.y parser/keywords.go returns no matches. The current routine-characteristics list does not accept LANGUAGE other than the SQL/2003-standard LANGUAGE SQL (if at all).

Example SQL

CREATE FUNCTION js_add(a INT, b INT) RETURNS INT
  LANGUAGE JAVASCRIPT
  DETERMINISTIC
  NO SQL
  AS $$
    return a + b;
  $$;
CREATE PROCEDURE js_log(IN msg VARCHAR(255))
  LANGUAGE JAVASCRIPT
  AS $$
    console.log(msg);
  $$;

The body delimiter can be any matching $tag$ ... $tag$ pair:

CREATE FUNCTION js_q(s VARCHAR(64)) RETURNS VARCHAR(128)
  LANGUAGE JAVASCRIPT
  DETERMINISTIC
  NO SQL
  AS $body$
    return "got: " + s.replace(/'/g, "''");
  $body$;

Validation

CREATE FUNCTION ... LANGUAGE JAVASCRIPT ... AS $$ ... $$; parses against MySQL 9.2.0 Community. (The community build returns ER_LANGUAGE_COMPONENT_NOT_AVAILABLE when the function is invoked; that is the runtime, not the parser, rejecting it.)

Notes for the implementer

  • Add LANGUAGE (already a keyword in some grammars), JAVASCRIPT as keywords.
  • Lexer changes: recognise $tag$ ... $tag$ dollar-quoted strings as the routine body when preceded by AS in a CREATE FUNCTION/PROCEDURE with LANGUAGE JAVASCRIPT. The opening tag may be empty ($$) or alphanumeric ($body$).
  • Routine AST: add a Language characteristic (SQL / JAVASCRIPT) and a raw-body string for non-SQL bodies.
  • Also enables PREPARE/EXECUTE of event DDL (preparable as of MySQL 9.0).
  • Reference: https://dev.mysql.com/doc/refman/9.2/en/create-procedure.html

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions