Changeset: ecbeb4a7285d for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=ecbeb4a7285d
Added Files:
        sql/scripts/97_comments.sql
        sql/test/Tests/comment-auth-a.sql
        sql/test/Tests/comment-auth-superuser.sql
        sql/test/Tests/comment-auth.SQL.py
        sql/test/Tests/comment-auth.stable.err
        sql/test/Tests/comment-auth.stable.out
        sql/test/Tests/comment-dump.SQL.py
        sql/test/Tests/comment-dump.sql
        sql/test/Tests/comment-dump.stable.err
        sql/test/Tests/comment-dump.stable.out
        sql/test/Tests/comment-on.sql
        sql/test/Tests/comment-on.stable.err
        sql/test/Tests/comment-on.stable.out
Modified Files:
        ChangeLog.Jul2017
        buildtools/ChangeLog.Jul2017
        clients/ChangeLog.Jul2017
        clients/mapiclient/Makefile.ag
        clients/mapiclient/dump.c
        clients/mapiclient/mclient.c
        clients/mapiclient/msqldump.c
        clients/mapiclient/msqldump.h
        clients/mapilib/ChangeLog.Jul2017
        common/stream/ChangeLog.Jul2017
        gdk/ChangeLog.Jul2017
        geom/ChangeLog.Jul2017
        monetdb5/ChangeLog.Jul2017
        sql/ChangeLog.Jul2017
        sql/backends/monet5/sql_upgrades.c
        sql/scripts/99_system.sql
        sql/scripts/Makefile.ag
        sql/server/rel_schema.c
        sql/server/rel_semantic.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
        sql/server/sql_parser.h
        sql/server/sql_parser.y
        sql/server/sql_scan.c
        sql/storage/sql_storage.h
        sql/storage/store.c
        
sql/test/BugTracker-2016/Tests/column_name_lost_in_in_operator.Bug-6123.sql
        sql/test/BugTracker-2016/Tests/dce.Bug-6114.sql
        sql/test/BugTracker-2016/Tests/semijoin.Bug-6116.sql
        sql/test/BugTracker-2016/Tests/semijoin.Bug-6116.stable.out
        sql/test/BugTracker-2016/Tests/split_project.Bug-6117.sql
        
sql/test/BugTracker-2017/Tests/crash_correlated_subqueries_in_select.Bug-6254.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out
        sql/test/Dependencies/Tests/Dependencies.stable.out.int128
        sql/test/Dependencies/Tests/dependency_loop.stable.out
        sql/test/Dependencies/Tests/dependency_loop.stable.out.int128
        sql/test/DropCascade/Tests/drop_columns_cascade.sql
        sql/test/DropCascade/Tests/drop_pkey_cascade.sql
        sql/test/Tests/All
        sql/test/Tests/keys.stable.out
        sql/test/Tests/systemfunctions.stable.out
        sql/test/Tests/systemfunctions.stable.out.int128
        sql/test/emptydb/Tests/check.stable.out
        sql/test/emptydb/Tests/check.stable.out.32bit
        sql/test/emptydb/Tests/check.stable.out.int128
        testing/ChangeLog.Jul2017
        tools/merovingian/ChangeLog.Jul2017
Branch: default
Log Message:

Merge branch comment-on back into the default branch


diffs (truncated from 6696 to 300 lines):

diff --git a/clients/mapiclient/dump.c b/clients/mapiclient/dump.c
--- a/clients/mapiclient/dump.c
+++ b/clients/mapiclient/dump.c
@@ -48,6 +48,131 @@ quoted_print(stream *f, const char *s, c
        mnstr_write(f, singleq ? "'" : "\"", 1, 1);
 }
 
+/*Used to buffer comment values while we're in the process of
+ * dumping something else.  For example, while we're dumping the
+ * columns of a table, we buffer any column comments we find so we
+ * can emit them after the closing ')' of the CREATE TABLE statement.
+ */
+typedef struct comment_buffer {
+        buffer *buf;
+        stream *append;
+} comment_buffer;
+static comment_buffer *comment_buffer_create(void);
+stream *comment_appender(comment_buffer *comments);
+static int append_comment(
+        comment_buffer *comments,
+        const char *obj_type,
+        const char *schema_name,
+        const char *outer_name,
+        const char *inner_name,
+        void *parameter_types,
+        const char *remark
+);
+static int write_comment_buffer(stream *out, comment_buffer *comments);
+static void comment_buffer_destroy(comment_buffer *comments);
+
+comment_buffer*
+comment_buffer_create(void)
+{
+        buffer *buf;
+        stream *s;
+        comment_buffer *comments;
+
+        buf = buffer_create(4000);
+        if (!buf)
+        return NULL;
+
+        s = buffer_wastream(buf, "comments_buffer");
+        if (s == NULL) {
+                buffer_destroy(buf);
+                return NULL;
+        }
+
+        comments = malloc(sizeof(*comments));
+        if (comments == NULL) {
+                mnstr_destroy(s);
+                buffer_destroy(buf);
+                return NULL;
+        }
+
+        comments->buf = buf;
+        comments->append = s;
+
+        return comments;
+}
+
+stream *
+comment_appender(comment_buffer *comments)
+{
+        return comments->append;
+}
+
+int
+append_comment(
+        comment_buffer *comments,
+        const char *obj_type,
+        const char *schema_name,
+        const char *outer_name,
+        const char *inner_name,
+        void *parameter_types,
+        const char *remark
+) {
+        char *sep = "";
+
+        if (!remark)
+                return 0;
+
+        mnstr_printf(comments->append, "COMMENT ON %s ", obj_type);
+        if (schema_name) {
+                mnstr_printf(comments->append, "%s", sep);
+                quoted_print(comments->append, schema_name, 0);
+                sep = ".";
+        }
+        if (outer_name) {
+                mnstr_printf(comments->append, "%s", sep);
+                quoted_print(comments->append, outer_name, 0);
+                sep = ".";
+        }
+        if (inner_name) {
+                mnstr_printf(comments->append, "%s", sep);
+                quoted_print(comments->append, inner_name, 0);
+                sep = ".";
+        }
+        (void) parameter_types;
+
+        mnstr_printf(comments->append, " IS ");
+        quoted_print(comments->append, remark, 1);
+        mnstr_printf(comments->append, ";\n");
+
+        return 0;
+}
+
+int
+write_comment_buffer(stream *out, comment_buffer *comments)
+{
+        assert((comments->buf == NULL) == (comments->append == NULL));
+        if (comments->buf == NULL)
+                return 0;
+
+        if (out) {
+                char *text = buffer_get_buf(comments->buf);
+                if (text) {
+                        mnstr_printf(out, "%s", text);
+                        free(text);
+                }
+        }
+
+        return 0;
+}
+
+void
+comment_buffer_destroy(comment_buffer *comments)
+{
+        mnstr_destroy(comments->append);
+        buffer_destroy(comments->buf);
+        free(comments);
+}
+
 static char *actions[] = {
        0,
        "CASCADE",
@@ -346,6 +471,7 @@ toUpper(const char *s)
 static int dump_column_definition(
        Mapi mid,
        stream *toConsole,
+       comment_buffer *comments,
        const char *schema,
        const char *tname,
        const char *tid,
@@ -463,7 +589,7 @@ dump_type(Mapi mid, stream *toConsole, c
                space = mnstr_printf(toConsole, "DECIMAL");
        } else if (strcmp(c_type, "table") == 0) {
                mnstr_printf(toConsole, "TABLE ");
-               dump_column_definition(mid, toConsole, NULL, NULL, 
c_type_digits, 1, hashge);
+               dump_column_definition(mid, toConsole, NULL, NULL, NULL, 
c_type_digits, 1, hashge);
        } else if (strcmp(c_type, "geometry") == 0 &&
                   strcmp(c_type_digits, "0") != 0) {
                const char *geom = NULL;
@@ -499,7 +625,7 @@ dump_type(Mapi mid, stream *toConsole, c
 }
 
 static int
-dump_column_definition(Mapi mid, stream *toConsole, const char *schema, const 
char *tname, const char *tid, int foreign, int hashge)
+dump_column_definition(Mapi mid, stream *toConsole, comment_buffer *comments, 
const char *schema, const char *tname, const char *tid, int foreign, int hashge)
 {
        MapiHdl hdl = NULL;
        char *query;
@@ -527,8 +653,9 @@ dump_column_definition(Mapi mid, stream 
                                "c.type_scale, "        /* 3 */
                                "c.\"null\", "          /* 4 */
                                "c.\"default\", "       /* 5 */
-                               "c.number "             /* 6 */
-                        "FROM sys._columns c "
+                               "c.number, "            /* 6 */
+                               "rem.remark "            /* 7 */
+                        "FROM sys._columns c LEFT OUTER JOIN sys.comments rem 
ON c.id = rem.id "
                         "WHERE c.table_id = %s "
                         "ORDER BY number", tid);
        else
@@ -539,8 +666,9 @@ dump_column_definition(Mapi mid, stream 
                                "c.type_scale, "        /* 3 */
                                "c.\"null\", "          /* 4 */
                                "c.\"default\", "       /* 5 */
-                               "c.number "             /* 6 */
-                        "FROM sys._columns c, "
+                               "c.number, "            /* 6 */
+                               "rem.remark "           /* 7 */
+                        "FROM sys._columns c LEFT OUTER JOIN sys.comments rem 
ON c.id = rem.id, "
                              "sys._tables t, "
                              "sys.schemas s "
                         "WHERE c.table_id = t.id AND "
@@ -560,6 +688,7 @@ dump_column_definition(Mapi mid, stream 
                const char *c_type_scale = mapi_fetch_field(hdl, 3);
                const char *c_null = mapi_fetch_field(hdl, 4);
                const char *c_default = mapi_fetch_field(hdl, 5);
+               const char *c_remark = mapi_fetch_field(hdl, 7);
                int space;
 
                if (mapi_error(mid))
@@ -578,6 +707,9 @@ dump_column_definition(Mapi mid, stream 
                if (c_default != NULL)
                        mnstr_printf(toConsole, "%*s DEFAULT %s",
                                        CAP(13 - space), "", c_default);
+
+               if (schema && tname)
+                       append_comment(comments, "COLUMN", schema, tname, 
c_name, NULL, c_remark);
                cnt++;
                if (mnstr_errnr(toConsole))
                        goto bailout;
@@ -743,10 +875,12 @@ describe_table(Mapi mid, const char *sch
        MapiHdl hdl = NULL;
        char *query;
        char *view = NULL;
+       char *remark = NULL;
        int type = 0;
        size_t maxquerylen;
        char *sname = NULL;
        int hashge;
+       comment_buffer *comments = comment_buffer_create();
 
        if (schema == NULL) {
                if ((sname = strchr(tname, '.')) != NULL) {
@@ -768,8 +902,8 @@ describe_table(Mapi mid, const char *sch
 
        query = malloc(maxquerylen);
        snprintf(query, maxquerylen,
-                "SELECT t.name, t.query, t.type "
-                "FROM sys._tables t, sys.schemas s "
+                "SELECT t.name, t.query, t.type, c.remark "
+                "FROM sys.schemas s, sys._tables t LEFT OUTER JOIN 
sys.comments c ON t.id = c.id "
                 "WHERE s.name = '%s' AND "
                       "t.schema_id = s.id AND "
                       "t.name = '%s'",
@@ -784,11 +918,13 @@ describe_table(Mapi mid, const char *sch
                if (view)
                        type = atoi(view);
                view = mapi_fetch_field(hdl, 1);
+               remark = mapi_fetch_field(hdl, 3);
        }
        if (mapi_error(mid)) {
                view = NULL;
                goto bailout;
        }
+       append_comment(comments, type != 1 ? "TABLE" : "VIEW", sname, tname, 
NULL, NULL, remark);
        if (view)
                view = strdup(view);
        mapi_close_handle(hdl);
@@ -816,7 +952,7 @@ describe_table(Mapi mid, const char *sch
                             "",
                             schema, tname);
 
-               if (dump_column_definition(mid, toConsole, schema, tname, NULL, 
foreign, hashge))
+               if (dump_column_definition(mid, toConsole, comments, schema, 
tname, NULL, foreign, hashge))
                        goto bailout;
                if (type == 5)
                        mnstr_printf(toConsole, " ON '%s'", view);
@@ -826,9 +962,11 @@ describe_table(Mapi mid, const char *sch
                         "SELECT i.name, "              /* 0 */
                                "k.name, "              /* 1 */
                                "kc.nr, "               /* 2 */
-                               "c.name "               /* 3 */
-                        "FROM sys.idxs AS i LEFT JOIN sys.keys AS k "
-                                       "ON i.name = k.name, "
+                               "c.name, "              /* 3 */
+                               "rem.remark "           /* 4 */
+                        "FROM sys.idxs AS i "
+                               "LEFT JOIN sys.keys AS k ON i.name = k.name "
+                               "LEFT OUTER JOIN sys.comments rem ON i.id = 
rem.id, "
                              "sys.objects AS kc, "
                              "sys._columns AS c, "
                              "sys.schemas s, "
@@ -850,6 +988,7 @@ describe_table(Mapi mid, const char *sch
                        const char *k_name = mapi_fetch_field(hdl, 1);
                        const char *kc_nr = mapi_fetch_field(hdl, 2);
                        const char *c_name = mapi_fetch_field(hdl, 3);
+                       const char *remark = mapi_fetch_field(hdl, 4);
 
                        if (mapi_error(mid))
                                goto bailout;
@@ -864,6 +1003,7 @@ describe_table(Mapi mid, const char *sch
                                mnstr_printf(toConsole,
                                             "CREATE INDEX \"%s\" ON 
\"%s\".\"%s\" (",
                                             i_name, schema, tname);
+                               append_comment(comments, "INDEX", schema, 
i_name, NULL, NULL, remark);
                                cnt = 1;
                        } else
                                mnstr_printf(toConsole, ", ");
@@ -877,6 +1017,9 @@ describe_table(Mapi mid, const char *sch
                        goto bailout;
        }
 
+       write_comment_buffer(toConsole, comments);
+       comment_buffer_destroy(comments);
+
        if (hdl)
                mapi_close_handle(hdl);
        if (view)
@@ -902,6 +1045,7 @@ describe_table(Mapi mid, const char *sch
                free(sname);
        if (query != NULL)
                free(query);
+       comment_buffer_destroy(comments);
        return 1;
 }
 
@@ -912,6 +1056,7 @@ describe_sequence(Mapi mid, const char *
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to