예제 #1
0
 /// <summary>
 /// Expression constructor using an <see cref="Expression"/>.
 /// </summary>
 /// <param name="e"></param>
 public Expression(Expression e)
 {
     _type = e.Type;
     _columnType = e.ColumnType;
     eArg = e.eArg;
     eArg2 = e.eArg2;
     cLikeEscape = e.cLikeEscape;
     sSelect = e.sSelect;
     fFunction = e.fFunction;
 }
예제 #2
0
        private Select ParseSelect()
        {
            Select select = new Select ();
            // [email protected] begin changes from 1.50
            select.limitStart = 0;
            select.limitCount = cChannel.MaxRows;
            // [email protected] end changes from 1.50
            string token = tTokenizer.GetString ();

            if (token.Equals ("DISTINCT")) {
                select.bDistinct = true;
                // [email protected] begin changes from 1.50
            } else if (token.Equals ("LIMIT")) {
                string limStart = tTokenizer.GetString ();
                string limEnd = tTokenizer.GetString ();
                //System.out.println( "LIMIT used from "+limStart+","+limEnd);
                select.limitStart = int.Parse (limStart);
                select.limitCount = int.Parse (limEnd);
                // [email protected] end changes from 1.50
            } else {
                tTokenizer.Back ();
            }

            // parse column list
            ArrayList vcolumn = new ArrayList ();
            select.OnlyVars = true;

            do {
                Expression e = ParseExpression ();

                token = tTokenizer.GetString ();

                if (token.Equals ("AS")) {
                    e.Alias = tTokenizer.GetName ();

                    token = tTokenizer.GetString ();
                } else if (tTokenizer.WasName) {
                    e.Alias = token;

                    token = tTokenizer.GetString ();
                }

                vcolumn.Add (e);

                select.OnlyVars = select.OnlyVars & (e.Type == ExpressionType.Variable);

            } while (token.Equals (","));

            if (!select.OnlyVars) {
                if (token.Equals ("INTO")) {
                    select.sIntoTable = tTokenizer.GetString ();
                    token = tTokenizer.GetString ();
                }

                if (!token.Equals ("FROM")) {
                    throw TracingHelper.Error (TracingHelper.UnexpectedToken, token);
                }

                Expression condition = null;

                // parse table list
                ArrayList vfilter = new ArrayList ();

                vfilter.Add (ParseTableFilter (false));

                while (true) {
                    token = tTokenizer.GetString ();

                    if (token.Equals ("LEFT")) {
                        token = tTokenizer.GetString ();

                        if (token.Equals ("OUTER")) {
                            token = tTokenizer.GetString ();
                        }

                        TracingHelper.Check (token.Equals ("JOIN"), TracingHelper.UnexpectedToken,
                            token);
                        vfilter.Add (ParseTableFilter (true));
                        tTokenizer.GetThis ("ON");

                        condition = AddCondition (condition, ParseExpression ());
                    } else if (token.Equals ("INNER")) {
                        tTokenizer.GetThis ("JOIN");
                        vfilter.Add (ParseTableFilter (false));
                        tTokenizer.GetThis ("ON");

                        condition = AddCondition (condition, ParseExpression ());
                    } else if (token.Equals (",")) {
                        vfilter.Add (ParseTableFilter (false));
                    } else {
                        break;
                    }
                }

                tTokenizer.Back ();

                int len = vfilter.Count;
                TableFilter[] filter = new TableFilter[len];

                vfilter.CopyTo (filter);

                select.tFilter = filter;

                // expand [table.]* columns
                len = vcolumn.Count;

                for (int i = 0; i < len; i++) {
                    Expression e = (Expression)(vcolumn [i]);

                    if (e.Type == ExpressionType.Asterix) {
                        int current = i;
                        Table table = null;
                        string n = e.TableName;

                        for (int t = 0; t < filter.Length; t++) {
                            TableFilter f = filter [t];

                            e.Resolve (f);

                            if (n != null && !n.Equals (f.Name)) {
                                continue;
                            }

                            table = f.Table;

                            int col = table.ColumnCount;

                            for (int c = 0; c < col; c++) {
                                Expression ins =
                                    new Expression (f.Name,
                                        table.GetColumnName (c));

                                vcolumn.Insert (current++, ins);

                                // now there is one element more to parse
                                len++;
                            }
                        }

                        TracingHelper.Check (table != null, TracingHelper.TABLE_NOT_FOUND, n);

                        // minus the asterix element
                        len--;

                        vcolumn.RemoveAt (current);
                    } else if (e.Type == ExpressionType.DatabaseColumn) {
                        if (e.TableName == null) {
                            for (int filterIndex = 0; filterIndex < filter.Length; filterIndex++) {
                                e.Resolve (filter [filterIndex]);
                            }
                        }
                    }
                }

                select.iResultLen = len;

                // where
                token = tTokenizer.GetString ();

                if (token.Equals ("WHERE")) {
                    condition = AddCondition (condition, ParseExpression ());
                    token = tTokenizer.GetString ();
                }

                select.eCondition = condition;

                if (token.Equals ("GROUP")) {
                    tTokenizer.GetThis ("BY");

                    len = 0;

                    do {
                        vcolumn.Add (ParseExpression ());

                        token = tTokenizer.GetString ();
                        len++;
                    } while (token.Equals (","));

                    select.iGroupLen = len;
                }

                if (token.Equals ("ORDER")) {
                    tTokenizer.GetThis ("BY");

                    len = 0;

                    do {
                        Expression e = ParseExpression ();

                        if (e.Type == ExpressionType.Value) {

                            // order by 1,2,3
                            if (e.ColumnType == ColumnType.Integer) {
                                int i = Convert.ToInt32 (e.GetValue ());

                                e = (Expression)vcolumn [i - 1];
                            }
                        } else if (e.Type == ExpressionType.DatabaseColumn
                                   && e.TableName == null) {

                            // this could be an alias column
                            string s = e.ColumnName;

                            for (int i = 0; i < vcolumn.Count; i++) {
                                Expression ec = (Expression)vcolumn [i];

                                if (s.Equals (ec.Alias)) {
                                    e = ec;

                                    break;
                                }
                            }
                        }

                        token = tTokenizer.GetString ();

                        if (token.Equals ("DESC")) {
                            e.IsDescending = true;

                            token = tTokenizer.GetString ();
                        } else if (token.Equals ("ASC")) {
                            token = tTokenizer.GetString ();
                        }

                        vcolumn.Add (e);

                        len++;
                    } while (token.Equals (","));

                    select.iOrderLen = len;
                }

                len = vcolumn.Count;
                select.eColumn = new Expression[len];

                vcolumn.CopyTo (select.eColumn);

                if (token.Equals ("UNION")) {
                    token = tTokenizer.GetString ();

                    if (token.Equals ("ALL")) {
                        select.UnionType = SelectType.UnionAll;
                    } else {
                        select.UnionType = SelectType.Union;

                        tTokenizer.Back ();
                    }

                    tTokenizer.GetThis ("SELECT");

                    select.sUnion = ParseSelect ();
                } else if (token.Equals ("INTERSECT")) {
                    tTokenizer.GetThis ("SELECT");

                    select.UnionType = SelectType.Intersect;
                    select.sUnion = ParseSelect ();
                } else if (token.Equals ("EXCEPT") || token.Equals ("MINUS")) {
                    tTokenizer.GetThis ("SELECT");

                    select.UnionType = SelectType.Except;
                    select.sUnion = ParseSelect ();
                } else {
                    tTokenizer.Back ();
                }
            } else {
                select.tFilter = new TableFilter[]{ };

                int len = vcolumn.Count;
                select.iResultLen = len;
                select.eColumn = new Expression[len];
                vcolumn.CopyTo (select.eColumn);
            }

            return select;
        }
예제 #3
0
 /// <summary>
 /// Expression constructor using a <see cref="Select"/>.
 /// </summary>
 /// <param name="s"></param>
 public Expression(Select s)
 {
     _type = ExpressionType.Query;
     sSelect = s;
 }