TO_ QUERY
On this page
Allows you to convert a dynamic SQL statement to a query type value.
Note: Queries that are built from the TO_
function and query type values are parameterized when they are run, which allows plans to be reused in the plancache.
Syntax
TO_QUERY ( select_statement )
Arguments
select_
A string containing a SELECT statement.
Return Type
String
Remarks
TO_
may be used in an assignment statement where a query type variable is on the left side.
TO_
and COLLECT
are often used together to specify and run dynamic queries.
Examples
Using TO_ QUERY
in an assignment statement
In the example below, following the assignment to the query type variable, the procedure p
returns the value of the query type variable.ECHO
statement.
DROP DATABASE IF EXISTS singlestore_docs_example;CREATE DATABASE singlestore_docs_example;use singlestore_docs_example;CREATE TABLE t1(color TEXT);CREATE TABLE t2(color TEXT);INSERT INTO t1 VALUES ('red'), ('green'), ('blue');INSERT INTO t2 VALUES ('orange'), ('blue'), ('purple');DELIMITER //CREATE PROCEDURE p(tbl TEXT)RETURNS QUERY(color TEXT) ASDECLAREq QUERY(color TEXT) = TO_QUERY(CONCAT('SELECT color FROM ', tbl));BEGINRETURN q;END//DELIMITER ;ECHO p('t2');
+--------+
| color |
+--------+
| purple |
| orange |
| blue |
+--------+
Using TO_ QUERY
in a RETURN
statement
The example below, the procedure p
returns a query type value.
DROP DATABASE IF EXISTS singlestore_docs_example;CREATE DATABASE singlestore_docs_example;use singlestore_docs_example;CREATE TABLE t1(color TEXT);CREATE TABLE t2(color TEXT);INSERT INTO t1 VALUES ('red'), ('green'), ('blue');INSERT INTO t2 VALUES ('orange'), ('blue'), ('purple');DELIMITER //CREATE PROCEDURE p(tbl TEXT)RETURNS QUERY(color TEXT) ASBEGINRETURN TO_QUERY(CONCAT('SELECT color FROM ', tbl));END//DELIMITER ;ECHO p('t1');
+-------+
| color |
+-------+
| green |
| red |
| blue |
+-------+
Note
As a best practice, it is advisable to use TO_
when the shape of query to be built (e.WHERE
clause structure) will not be fully known until runtime.
In scenarios where the structure of the query is known, use statements like
q = SELECT a, b FROM t WHERE t.x = variable;
instead of
q = TO_QUERY(CONCAT("SELECT a, b FROM t WHERE t.x = ", variable));
The former is easier to read, and it should execute faster because it spends less time parsing at runtime.
Database Binding Behavior for TO_ QUERY()
QTVs Within a Stored Procedure
For TO_
query type values called inside a stored procedure, if the database is not specified, database binding is done at runtime.
The following example explains this behavior.
CREATE DATABASE db_test1;CREATE DATABASE db_test2;CREATE DATABASE db_test3;CREATE TABLE db_test1.tmp(val INT);INSERT INTO db_test1.tmp VALUES (1),(2);CREATE TABLE db_test2.tmp(val INT);INSERT INTO db_test2.tmp VALUES (3),(4);CREATE TABLE db_test3.tmp(val INT);INSERT INTO db_test3.tmp VALUES (5),(6);DELIMITER //CREATE OR REPLACE PROCEDURE db_test3.sp1() ASDECLAREq QUERY(val INT) = TO_QUERY("SELECT * FROM tmp");p QUERY(val INT) = TO_QUERY("SELECT * FROM db_test1.tmp");BEGINECHO SELECT * FROM q;ECHO SELECT * FROM p;END //DELIMITER ;
Observe the query behavior by switching between the context databases with the USE
command.
USE db_test1;CALL db_test3.sp1();
+------+
| val |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.12 sec)
+------+
| val |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.12 sec)
USE db_test2;CALL db_test3.sp1();
+------+
| val |
+------+
| 3 |
| 4 |
+------+
2 rows in set (0.12 sec)
+------+
| val |
+------+
| 1 |
| 2 |
+------+
2 rows in set (0.12 sec)
The queries (where database is not specified inside the stored procedure) use the currently selected database, which means that database binding happened at runtime.
Related Topics
Last modified: June 15, 2023