Changeset: 628d95b5d34a for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/628d95b5d34a
Modified Files:
        sql/server/sql_semantic.c
Branch: default
Log Message:

Replace macro with function.


diffs (185 lines):

diff --git a/sql/server/sql_semantic.c b/sql/server/sql_semantic.c
--- a/sql/server/sql_semantic.c
+++ b/sql/server/sql_semantic.c
@@ -114,7 +114,6 @@ tmp_schema(mvc *sql)
 
 #define DO_NOTHING(x) ((void) 0)
 
-/* as we don't have OOP in C, I prefer a single macro with the search path 
algorithm to passing function pointers */
 #define search_object_on_path(CALL, EXTRA_CONDITION, EXTRA, ERROR_CODE, 
show_error) \
        do { \
                sql_schema *next = NULL; \
@@ -156,64 +155,122 @@ tmp_schema(mvc *sql)
                        return sql_error(sql, ERR_NOTFOUND, ERROR_CODE "%s: no 
such %s %s%s%s'%s'", error, objstr, sname ? "'":"", sname ? sname : "", sname ? 
"'.":"", name); \
        } while (0)
 
-#define table_extra \
-       do { \
-               if (s) { \
-                       next = s; /* there's a default schema to search before 
all others, e.g. bind a child table from a merge table */ \
-                       res = mvc_bind_table(sql, next, name); \
-               } \
-               if (!res && strcmp(objstr, "table") == 0 && (res = 
stack_find_table(sql, name))) /* for tables, first try a declared table from 
the stack */ \
-                       return res; \
-       } while (0)
+/* more or less the above, but as a function */
+static sql_base *
+search_object_on_path_func(mvc *sql,
+                                                  sql_base *(*func)(mvc *, 
sql_schema *, const char *),
+                                                  sql_schema *s, const char 
*sname, const char *name,
+                                                  const char *error_code,
+                                                  const char *objstr, const 
char *error)
+{
+       sql_schema *next = NULL;
+       sql_base *res = NULL;
+
+       if (sname) {
+               /* user has explicitly typed the schema, so either the object is
+                * there or we return error */
+               if ((next = mvc_bind_schema(sql, sname)) == NULL)
+                       return sql_error(sql, ERR_NOTFOUND,
+                                                        SQLSTATE(3F000) "%s: 
no such schema '%s'",
+                                                        error, sname);
+               if (res == NULL) {
+                       res = func(sql, next, name);
+               }
+       } else {
+               sql_schema *cur = cur_schema(sql);
+               char *session_schema = cur->base.name;
+
+               if (s) {
+                       /* s is only ever not NULL for tables/views */
+                       res = func(sql, s, name);
+               }
+               if (res == NULL && strcmp(objstr, "table") == 0) {
+                       res = (sql_base *) stack_find_table(sql, name);
+                       if (res)
+                               return res;
+               }
+               if (!res && !sql->schema_path_has_tmp && strcmp(session_schema, 
"tmp") != 0) {
+                       /* if 'tmp' is not in the search path, search it before 
all
+                        * others */
+                       res = func(sql, tmp_schema(sql), name);
+               }
+               if (!res) { /* then current session's schema */
+                       res = func(sql, cur, name);
+               }
+               if (!res) {
+                       /* object not found yet, look inside search path */
+                       for (node *n = sql->schema_path->h ; n && !res ; n = 
n->next) {
+                               str p = (str) n->data;
+                               if (strcmp(session_schema, p) != 0 && (next = 
mvc_bind_schema(sql, p)))
+                                       res = func(sql, next, name);
+                       }
+               }
+               if (!res && !sql->schema_path_has_sys && strcmp(session_schema, 
"sys") != 0) {
+                       /* if 'sys' is not in the current path search it next */
+                       res = func(sql, mvc_bind_schema(sql, "sys"), name);
+               }
+       }
+       if (!res)
+               return sql_error(sql, ERR_NOTFOUND, "%s%s: no such %s 
%s%s%s'%s'",
+                                                error_code, error, objstr, 
sname ? "'":"",
+                                                sname ? sname : "", sname ? 
"'.":"", name);
+       return res;
+}
 
 sql_table *
 find_table_or_view_on_scope(mvc *sql, sql_schema *s, const char *sname, const 
char *name, const char *error, bool isView)
 {
-       const char *objstr = isView ? "view" : "table";
-       sql_table *res = NULL;
+       return (sql_table *) search_object_on_path_func(
+               sql,
+               (sql_base *(*)(mvc *, sql_schema *, const char *)) 
mvc_bind_table,
+               s, sname, name, SQLSTATE(42S02), isView ? "view" : "table",
+               error);
+}
 
-       search_object_on_path(res = mvc_bind_table(sql, next, name), 
DO_NOTHING, table_extra, SQLSTATE(42S02), true);
-       return res;
+static sql_sequence *
+find_sequence(mvc *sql, sql_schema *s, const char *name)
+{
+       return find_sql_sequence(sql->session->tr, s, name);
 }
 
 sql_sequence *
 find_sequence_on_scope(mvc *sql, const char *sname, const char *name, const 
char *error)
 {
-       static const char objstr[] = "sequence";
-       sql_sequence *res = NULL;
-
-       search_object_on_path(res = find_sql_sequence(sql->session->tr, next, 
name), DO_NOTHING, ((void) 0), SQLSTATE(42000), true);
-       return res;
+       return (sql_sequence *) search_object_on_path_func(
+               sql,
+               (sql_base *(*)(mvc *, sql_schema *, const char *)) 
find_sequence,
+               NULL, sname, name, SQLSTATE(42000), "sequence",
+               error);
 }
 
 sql_idx *
 find_idx_on_scope(mvc *sql, const char *sname, const char *name, const char 
*error)
 {
-       static const char objstr[] = "index";
-       sql_idx *res = NULL;
-
-       search_object_on_path(res = mvc_bind_idx(sql, next, name), DO_NOTHING, 
((void) 0), SQLSTATE(42S12), true);
-       return res;
+       return (sql_idx *) search_object_on_path_func(
+               sql,
+               (sql_base *(*)(mvc *, sql_schema *, const char *)) mvc_bind_idx,
+               NULL, sname, name, SQLSTATE(42S12), "index",
+               error);
 }
 
 sql_type *
 find_type_on_scope(mvc *sql, const char *sname, const char *name, const char 
*error)
 {
-       static const char objstr[] = "type";
-       sql_type *res = NULL;
-
-       search_object_on_path(res = schema_bind_type(sql, next, name), 
DO_NOTHING, ((void) 0), SQLSTATE(42S01), true);
-       return res;
+       return (sql_type *) search_object_on_path_func(
+               sql,
+               (sql_base *(*)(mvc *, sql_schema *, const char *)) 
schema_bind_type,
+               NULL, sname, name, SQLSTATE(42S01), "type",
+               error);
 }
 
 sql_trigger *
 find_trigger_on_scope(mvc *sql, const char *sname, const char *name, const 
char *error)
 {
-       static const char objstr[] = "trigger";
-       sql_trigger *res = NULL;
-
-       search_object_on_path(res = mvc_bind_trigger(sql, next, name), 
DO_NOTHING, ((void) 0), SQLSTATE(3F000), true);
-       return res;
+       return (sql_trigger *) search_object_on_path_func(
+               sql,
+               (sql_base *(*)(mvc *, sql_schema *, const char *)) 
mvc_bind_trigger,
+               NULL, sname, name, SQLSTATE(3F000), "trigger",
+               error);
 }
 
 /* A variable can be any of the following, from the innermost to the outermost:
@@ -224,6 +281,7 @@ find_trigger_on_scope(mvc *sql, const ch
 #define variable_extra \
        do { \
                if (!res) { \
+                       int nr; \
                        if ((*var = stack_find_var_frame(sql, name, level))) { 
/* check if variable is known from the stack */ \
                                *tpe = &((*var)->var.tpe); \
                                res = true; \
@@ -250,9 +308,7 @@ find_variable_on_scope(mvc *sql, const c
 {
        static const char objstr[] = "variable";
        bool res = false;
-       int nr = 0;
 
-       (void)nr;
        search_object_on_path(var_find_on_global, DO_NOTHING, variable_extra, 
SQLSTATE(42000), true);
        return res;
 }
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]

Reply via email to