1 | /* |
2 | * This Source Code Form is subject to the terms of the Mozilla Public |
3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
5 | * |
6 | * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. |
7 | */ |
8 | |
9 | /* |
10 | * Environment variables |
11 | * ===================== |
12 | * |
13 | * The processing setting of the SQL front-end can collect information |
14 | * for postprocessing and debugging by setting a flag |
15 | * using the SQL construct: |
16 | * SET <variable>=<string> |
17 | * SET <variable>=<boolean> |
18 | * SET <variable>=<int> |
19 | * |
20 | * The SQL engine comes with a limited set of environment variables |
21 | * to control its behavior. |
22 | * The 'debug' variable takes an integer and sets the Mserver global |
23 | * debug flag. (See MonetDB documentation.) |
24 | * |
25 | * By default all remaining variables are stored as strings and |
26 | * any type analysis is up to the user. The can be freely used by the |
27 | * SQL programmer for inclusion in his queries. |
28 | * |
29 | * The limited number of built-in variables defined above are |
30 | * strongly typed the hard way. |
31 | * Moreover, they have a counterpart representation in the |
32 | * MVC structure to ease inspection during query processing. |
33 | * |
34 | * The variables can be retrieved using the table producing function var(); |
35 | */ |
36 | |
37 | #include "monetdb_config.h" |
38 | #include "sql_env.h" |
39 | #include "sql_semantic.h" |
40 | #include "sql_privileges.h" |
41 | #include "mal_exception.h" |
42 | |
43 | #define SESSION_RW 0 |
44 | #define SESSION_RO 1 |
45 | |
46 | str |
47 | #ifdef HAVE_HGE |
48 | sql_update_var(mvc *m, const char *name, char *sval, hge sgn) |
49 | #else |
50 | sql_update_var(mvc *m, const char *name, char *sval, lng sgn) |
51 | #endif |
52 | { |
53 | if (strcmp(name, "debug" ) == 0) { |
54 | #ifdef HAVE_HGE |
55 | assert((hge) GDK_int_min <= sgn && sgn <= (hge) GDK_int_max); |
56 | #else |
57 | assert((lng) GDK_int_min <= sgn && sgn <= (lng) GDK_int_max); |
58 | #endif |
59 | m->debug = (int) sgn; |
60 | } else if (strcmp(name, "current_schema" ) == 0) { |
61 | if (!mvc_set_schema(m, sval)) { |
62 | throw(SQL,"sql.update_var" , SQLSTATE(3F000) "Schema (%s) missing\n" , sval); |
63 | } |
64 | } else if (strcmp(name, "current_role" ) == 0) { |
65 | if (!mvc_set_role(m, sval)) { |
66 | throw(SQL,"sql.update_var" , SQLSTATE(42000) "Role (%s) missing\n" , sval); |
67 | } |
68 | } else if (strcmp(name, "current_timezone" ) == 0) { |
69 | #ifdef HAVE_HGE |
70 | assert((hge) GDK_int_min <= sgn && sgn <= (hge) GDK_int_max); |
71 | #else |
72 | assert((lng) GDK_int_min <= sgn && sgn <= (lng) GDK_int_max); |
73 | #endif |
74 | m->timezone = (int) sgn; |
75 | } else if (strcmp(name, "cache" ) == 0) { |
76 | #ifdef HAVE_HGE |
77 | assert((hge) GDK_int_min <= sgn && sgn <= (hge) GDK_int_max); |
78 | #else |
79 | assert((lng) GDK_int_min <= sgn && sgn <= (lng) GDK_int_max); |
80 | #endif |
81 | m->cache = (int) sgn; |
82 | } |
83 | return NULL; |
84 | } |
85 | |
86 | int |
87 | sql_create_env(mvc *m, sql_schema *s) |
88 | { |
89 | list *res, *ops; |
90 | |
91 | res = sa_list(m->sa); |
92 | list_append(res, sql_create_arg(m->sa, "name" , sql_bind_subtype(m->sa, "varchar" , 1024, 0), ARG_OUT)); |
93 | list_append(res, sql_create_arg(m->sa, "value" , sql_bind_subtype(m->sa, "varchar" , 2048, 0), ARG_OUT)); |
94 | |
95 | /* add function */ |
96 | ops = sa_list(m->sa); |
97 | mvc_create_func(m, NULL, s, "env" , ops, res, F_UNION, FUNC_LANG_SQL, "sql" , "sql_environment" , "CREATE FUNCTION env () RETURNS TABLE( name varchar(1024), value varchar(2048)) EXTERNAL NAME sql.sql_environment;" , FALSE, FALSE, TRUE); |
98 | |
99 | res = sa_list(m->sa); |
100 | list_append(res, sql_create_arg(m->sa, "name" , sql_bind_subtype(m->sa, "varchar" , 1024, 0), ARG_OUT)); |
101 | |
102 | /* add function */ |
103 | ops = sa_list(m->sa); |
104 | mvc_create_func(m, NULL, s, "var" , ops, res, F_UNION, FUNC_LANG_SQL, "sql" , "sql_variables" , "CREATE FUNCTION var() RETURNS TABLE( name varchar(1024)) EXTERNAL NAME sql.sql_variables;" , FALSE, FALSE, TRUE); |
105 | return 0; |
106 | } |
107 | |