]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Start a new experimental branch for support of Oracle-style CONNECT BY connect-by
authordrh <drh@noemail.net>
Mon, 6 Jan 2014 18:32:18 +0000 (18:32 +0000)
committerdrh <drh@noemail.net>
Mon, 6 Jan 2014 18:32:18 +0000 (18:32 +0000)
syntax.

FossilOrigin-Name: 4365ddd62d88dc73c59962cf27a3e038eabdb50b

manifest
manifest.uuid
src/parse.y
tool/mkkeywordhash.c

index 1d0ad0ed3f00e13a50bbaa446853cf4b8737290c..4a72d9a90c1bd78ff7b6fc3c6507a44abb27b1c0 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\stypo\sthat\sbreaks\sthe\sbuild\swhen\sSQLITE_ENABLE_TREE_EXPLAIN\sis\sdefined.
-D 2014-01-04T20:00:14.172
+C Start\sa\snew\sexperimental\sbranch\sfor\ssupport\sof\sOracle-style\sCONNECT\sBY\nsyntax.
+D 2014-01-06T18:32:18.802
 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f
 F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81
 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23
@@ -209,7 +209,7 @@ F src/os_unix.c abeb9d54036aaea6f4395050ce823f51217ae4d4
 F src/os_win.c 16eac0961603182ffc10c02b39fe830126538e07
 F src/pager.c efa923693e958696eee69b205a20bfbc402c8480
 F src/pager.h ffd5607f7b3e4590b415b007a4382f693334d428
-F src/parse.y acee1a9958539e21263362b194594c5255ad2fca
+F src/parse.y 201902e23b29ecee8e58bbd013733493cee6da86
 F src/pcache.c f8043b433a57aba85384a531e3937a804432a346
 F src/pcache.h a5e4f5d9f5d592051d91212c5949517971ae6222
 F src/pcache1.c 57fee9a9a617218f5037afbbe49b09da65bde56b
@@ -1113,7 +1113,7 @@ F tool/lemon.c 796930d5fc2036c7636f3f1ee12f9ae03719a2eb
 F tool/lempar.c 01ca97f87610d1dac6d8cd96ab109ab1130e76dc
 F tool/logest.c 7ad625cac3d54012b27d468b7af6612f78b9ba75
 F tool/mkautoconfamal.sh f8d8dbf7d62f409ebed5134998bf5b51d7266383
-F tool/mkkeywordhash.c 189d76644e373c7d0864c628deb8ce7b4f403591
+F tool/mkkeywordhash.c 86acc19b96361e90e18d2324b3f56af621aeda85
 F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e
 F tool/mkpragmatab.tcl 78a77b2c554d534c6f2dc903130186ed15715460
 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97
@@ -1148,7 +1148,10 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891
 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4
 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01
 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff
-P d6fcfc8890489b942e5b3f1bc271835d77c5ef96
-R 92a605458ee112680310df2ab331e715
+P f461e2b3973d0fe6a7b8cb7a3aaab8a30b3e16c0
+R 8ea35e9854af1f75afacc581ccadba4b
+T *branch * connect-by
+T *sym-connect-by *
+T -sym-trunk *
 U drh
-Z 1b6a595171700e1d6836f451072293d3
+Z 2785f3b4e9984046b3600748ab3ddac7
index 89e098a77e1b1906787c2bfc86ff3da444dacb5f..e62e133bad734db8318c9ffa91d10b5634f38dec 100644 (file)
@@ -1 +1 @@
-f461e2b3973d0fe6a7b8cb7a3aaab8a30b3e16c0
\ No newline at end of file
+4365ddd62d88dc73c59962cf27a3e038eabdb50b
\ No newline at end of file
index ba9feb10fc805f34671782eea8c6dc76c649374c..30284fcaeac3734e1a19be22ee08c58d8c41ce23 100644 (file)
@@ -102,6 +102,15 @@ struct ValueList {
   Select *pSelect;
 };
 
+/*
+** An instance of this structure stores the optional Oracle Hierarchical
+** Query clauses - the START WITH and CONNECT BY clauses.
+*/
+struct HierarchicalQuery {
+  Expr *pStartWith;    /* The START WITH condition */
+  Expr *pConnectBy;    /* The CONNECT BY condition */
+};
+
 } // end %include
 
 // Input is a single SQL command
@@ -438,7 +447,7 @@ multiselect_op(A) ::= UNION(OP).             {A = @OP;}
 multiselect_op(A) ::= UNION ALL.             {A = TK_ALL;}
 multiselect_op(A) ::= EXCEPT|INTERSECT(OP).  {A = @OP;}
 %endif SQLITE_OMIT_COMPOUND_SELECT
-oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y)
+oneselect(A) ::= SELECT distinct(D) selcollist(W) from(X) where_opt(Y) hq_opt
                  groupby_opt(P) having_opt(Q) orderby_opt(Z) limit_opt(L). {
   A = sqlite3SelectNew(pParse,W,X,Y,P,Q,Z,D,L.pLimit,L.pOffset);
 }
@@ -639,6 +648,19 @@ limit_opt(A) ::= LIMIT expr(X) OFFSET expr(Y).
 limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). 
                                       {A.pOffset = X.pExpr; A.pLimit = Y.pExpr;}
 
+///////// Oracle-style CONNECT BY clauses for hierarchical queries ////////////
+
+%type hq_opt {struct HierarchicalQuery}
+%destructor hq_opt {
+  sqlite3ExprDelete(pParse->db, $$.pStartWith);
+  sqlite3ExprDelete(pParse->db, $$.pConnectBy);
+}
+
+hq_opt(A) ::= START WITH expr(X) CONNECT BY expr(Y).
+                        { A.pStartWith=X.pExpr; A.pConnectBy=Y.pExpr; }
+hq_opt(A) ::= CONNECT BY expr(Y).    { A.pStartWith=0; A.pConnectBy=Y.pExpr; }
+hq_opt(A) ::= .                      { A.pStartWith=0; A.pConnectBy=0; }
+
 /////////////////////////// The DELETE statement /////////////////////////////
 //
 %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
@@ -985,6 +1007,8 @@ expr(A) ::= MINUS(B) expr(X). [BITNOT]
                                {spanUnaryPrefix(&A,pParse,TK_UMINUS,&X,&B);}
 expr(A) ::= PLUS(B) expr(X). [BITNOT]
                                {spanUnaryPrefix(&A,pParse,TK_UPLUS,&X,&B);}
+expr(A) ::= PRIOR(B) expr(X). [BITNOT]
+                               {spanUnaryPrefix(&A,pParse,TK_PRIOR,&X,&B);}
 
 %type between_op {int}
 between_op(A) ::= BETWEEN.     {A = 0;}
index f3ef73f39421fa715de4ca4dcebf76163051680e..0a76c4e02d1f704fe56f96cdff03f1d2df5421e8 100644 (file)
@@ -138,6 +138,11 @@ struct Keyword {
 #else
 #  define AUTOVACUUM 0x00020000
 #endif
+#ifdef SQLITE_OMIT_CONNECTBY
+#  define CONNECTBY  0
+#else
+#  define CONNECTBY  0x00040000
+#endif
 
 /*
 ** These are the keywords
@@ -167,6 +172,7 @@ static Keyword aKeywordTable[] = {
   { "COLUMN",           "TK_COLUMNKW",     ALTER                  },
   { "COMMIT",           "TK_COMMIT",       ALWAYS                 },
   { "CONFLICT",         "TK_CONFLICT",     CONFLICT               },
+  { "CONNECT",          "TK_CONNECT",      CONNECTBY              },
   { "CONSTRAINT",       "TK_CONSTRAINT",   ALWAYS                 },
   { "CREATE",           "TK_CREATE",       ALWAYS                 },
   { "CROSS",            "TK_JOIN_KW",      ALWAYS                 },
@@ -232,6 +238,7 @@ static Keyword aKeywordTable[] = {
   { "PLAN",             "TK_PLAN",         EXPLAIN                },
   { "PRAGMA",           "TK_PRAGMA",       PRAGMA                 },
   { "PRIMARY",          "TK_PRIMARY",      ALWAYS                 },
+  { "PRIOR",            "TK_PRIOR",        CONNECTBY              },
   { "QUERY",            "TK_QUERY",        EXPLAIN                },
   { "RAISE",            "TK_RAISE",        TRIGGER                },
   { "REFERENCES",       "TK_REFERENCES",   FKEY                   },
@@ -247,6 +254,7 @@ static Keyword aKeywordTable[] = {
   { "SAVEPOINT",        "TK_SAVEPOINT",    ALWAYS                 },
   { "SELECT",           "TK_SELECT",       ALWAYS                 },
   { "SET",              "TK_SET",          ALWAYS                 },
+  { "START",            "TK_START",        CONNECTBY              },
   { "TABLE",            "TK_TABLE",        ALWAYS                 },
   { "TEMP",             "TK_TEMP",         ALWAYS                 },
   { "TEMPORARY",        "TK_TEMP",         ALWAYS                 },
@@ -262,6 +270,7 @@ static Keyword aKeywordTable[] = {
   { "VALUES",           "TK_VALUES",       ALWAYS                 },
   { "VIEW",             "TK_VIEW",         VIEW                   },
   { "VIRTUAL",          "TK_VIRTUAL",      VTAB                   },
+  { "WITH",             "TK_WITH",         CONNECTBY              },
   { "WITHOUT",          "TK_WITHOUT",      ALWAYS                 },
   { "WHEN",             "TK_WHEN",         ALWAYS                 },
   { "WHERE",            "TK_WHERE",        ALWAYS                 },