Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-8100

Table functions (aka SQL functions returning tables)

    Details

    • Type: Task
    • Status: Open
    • Priority: Major
    • Resolution: Unresolved
    • Fix Version/s: None
    • Component/s: None
    • Labels:

      Description

      This is a part of MDEV-5199 (Table functions) which addresses table functions that are defined in SQL (as opposed to table functions that are implemented in C++ and loaded as .so/.dlls).

      This task is a GSOC '15 project of diwas joshi.

      Proposed syntax

      (note: the following differs from description in MDEV-5199, and this is the latest text).

      We will use SQL Server's variant of syntax, where CREATE FUNCTION explicitly mentions function name. To define a table function one will use:

      CREATE FUNCTION func_name (args)  RETURNS TABLE table_name (column type [, column type ...])
      

      Inside function body, table table_name is visible as a temporary table. The table is initially empty. The code of the function is expected to insert rows into table_name. When the function finishes, the table will be returned to outside as the function's result.

      Implementation overview

      Table function will create and populate a temporary table (either HEAP or Aria/MyISAM, just like it is done for other kinds of temporary tables). Once the table function has finished populating the temporary table, it will be returned to the statement that invoked the table function. The caller statement will then read the table.

      In other words, we will not support any kind of "streaming" for results of table function.

      A possible optimization

      Trivial functions (with the body of a single INSERT ... SELECT) can be treated as a VIEW. It is not clear whether this should be implemented in the scope of this WL entry.

      Other details

      Constant parameters

      Table functions must have constant parameters. One can't use things like

      select * from tbl1,  table_func(tbl1.column) where ...
      

      This is because our implementation will pre-populate table function tables once per query execution. MySQL/MariaDB optimizer doesn't support tables that may change their contents during query execution.

      Parser

      The parser should support all proposed syntax.
      note: the table can only be addressed through an alias. This syntax is not
      allowed:

      SELECT table_func(1,2).column FROM table_func(1,2)
      

      one must use

      SELECT T_ALIAS.column FROM table_func(1,2) as T_ALIAS
      

      Name resolution/preparation in the upper query

      When we find a table reference in the FROM clause, we should make
      a lookup in mysql.proc, make appropriate checks, then open and parse
      the function.
      We should be able to take the "RETURNS ...." statement and produce a TABLE
      object from it. This is needed for doing name resolution on the other parts
      of the "caller" query .

      Name resolution/preparation in the Stored Function

      When one defines a stored function:

      CREATE FUNCTION func_name (args)  RETURNS TABLE table_name (column type [, column type ...])
      BEGIN
         stmt1;
         stmt2;
      END
      

      All statements inside the body of the function (i.e. stmt1, stmt2, etc) must use a modified name resolution process where table table_name resolves to the table that will be returned by the function. This may shadow the real table with name table_name.

      mysql.proc contents

      How does table functions should be stored in mysql.proc table. Are they a special kind of

      Execution

      • "SELECT sp_func()" should return error for table functions

        Gliffy Diagrams

          Attachments

            Issue Links

              Activity

              Hide
              serg Sergei Golubchik added a comment -

              What statements are allowed for a result table_name inside a table function? I would think that SELECT/INSERT/UPDATE/DELETE should certainly be allowed. DROP (and, thus, CREATE OR REPLACE) should not be. TRUNCATE could. CREATE TABLE LIKE could. ALTER TABLE could not. In short, it seems that no DDL statements should be allowed and DML statements should be.

              Can this table have indexes? I don't see why not. They serve two purposes — one might need a unique constraint, and the optimizer might find these indexes useful.

              Show
              serg Sergei Golubchik added a comment - What statements are allowed for a result table_name inside a table function? I would think that SELECT/INSERT/UPDATE/DELETE should certainly be allowed. DROP (and, thus, CREATE OR REPLACE) should not be. TRUNCATE could. CREATE TABLE LIKE could. ALTER TABLE could not. In short, it seems that no DDL statements should be allowed and DML statements should be. Can this table have indexes? I don't see why not. They serve two purposes — one might need a unique constraint, and the optimizer might find these indexes useful.
              Show
              psergey Sergei Petrunia added a comment - https://lists.launchpad.net/maria-developers/msg08731.html
              Hide
              dj diwas joshi added a comment -

              Making progress on this project we have successfully parsed the input string for both create and select queries. There were some issues relating to shift/reduce conflicts coming up while parsing select queries, which were removed by sergei and me after discussing on it. As part of this both tasks https://mariadb.atlassian.net/browse/MDEV-8342 and https://mariadb.atlassian.net/browse/MDEV-8343 have been completed. We'll be continuing with next set of tasks.

              Show
              dj diwas joshi added a comment - Making progress on this project we have successfully parsed the input string for both create and select queries. There were some issues relating to shift/reduce conflicts coming up while parsing select queries, which were removed by sergei and me after discussing on it. As part of this both tasks https://mariadb.atlassian.net/browse/MDEV-8342 and https://mariadb.atlassian.net/browse/MDEV-8343 have been completed. We'll be continuing with next set of tasks.
              Hide
              psergey Sergei Petrunia added a comment -

              The syntax in the task description says:

               CREATE FUNCTION ... RETURNS TABLE table_name (column type [, column type ...])
              

              Actually it is

               CREATE FUNCTION func_name (args)  RETURNS TABLE table_name (column type [, column type ...])
              
              Show
              psergey Sergei Petrunia added a comment - The syntax in the task description says: CREATE FUNCTION ... RETURNS TABLE table_name (column type [, column type ...]) Actually it is CREATE FUNCTION func_name (args) RETURNS TABLE table_name (column type [, column type ...])
              Hide
              psergey Sergei Petrunia added a comment -

              Updated the description

              Show
              psergey Sergei Petrunia added a comment - Updated the description
              Hide
              psergey Sergei Petrunia added a comment -

              The tree for this project is here: https://github.com/djdij123/server.git

              Show
              psergey Sergei Petrunia added a comment - The tree for this project is here: https://github.com/djdij123/server.git

                People

                • Assignee:
                  psergey Sergei Petrunia
                  Reporter:
                  psergey Sergei Petrunia
                • Votes:
                  0 Vote for this issue
                  Watchers:
                  3 Start watching this issue

                  Dates

                  • Created:
                    Updated: