예제 #1
0
        private Table PlaceInSqlitePragma(PlaceHolderExpr ph)
        {
            // TableではなくColumnとして認識される
            var dummyExpr = Place(ph);

            if (dummyExpr.GetType() != typeof(Column))
            {
                throw new InvalidASTStructureError(
                          "PRAGMA TABLE_INFOにテーブル名以外の値の格納が試みられました");
            }

            // Columnオブジェクトからテーブル名を作成する
            // (SQLiteではテーブル名の名前空間は1階層のみである)
            Table table;
            var   dummyColumn = (Column)dummyExpr;

            if (string.IsNullOrEmpty(dummyColumn.TableAliasName))
            {
                table = new Table(dummyColumn.Name);
            }
            else
            {
                table = new Table(dummyColumn.TableAliasName, dummyColumn.Name);
            }
            return(table);
        }
예제 #2
0
        override sealed public void Visit(PlaceHolderExpr expr)
        {
            //
            // プレースホルダに当てはまるExpr式にvisitorを適用する
            //

            if (!_placeHolders.ContainsKey(expr.LabelName))
            {
                this.VisitOnPlaceHolder(expr);
                return;
            }

            if (!(_placeHolders[expr.LabelName] is Expr))
            {
                throw new CannotBuildASTException("Type of placeholder value is mismatched.");
            }

            var placeValue = (Expr)(_placeHolders[expr.LabelName]);

            if (this.NeedsBracket(expr.Parent, placeValue))
            {
                // 定義されたExpr演算子の優先順位に基づき、
                // 必要であればプレースホルダ値を括弧で囲む
                (new BracketedExpr(placeValue)).Accept(this);
            }
            else
            {
                placeValue.Accept(this);
            }
        }
예제 #3
0
        private Expr PlaceInBitwiseNot(PlaceHolderExpr ph)
        {
            var expr = this.Place(ph);

            if (expr.GetType() == typeof(BinaryOpExpr))
            {
                expr = new BracketedExpr(expr);
            }
            return(expr);
        }
예제 #4
0
 public void Visit(PlaceHolderExpr expr)
 {
     // プレースホルダに当てはまるExpr式に_visitorを適用する
     if (_placeHolders.ContainsKey(expr.LabelName))
     {
         _placeHolders[expr.LabelName].Accept(_visitor);
     }
     else
     {
         _visitor.Visit(expr);
     }
 }
 protected override Expr Place(PlaceHolderExpr ph)
 {
     if (_isSqlitePragmaStmt)
     {
         // SQLiteのPRAGMA文のテーブル名プレースホルダはNULLに置き換えない
         return(ph);
     }
     else
     {
         // NULL値は全てのPlaceHolderExprに適用できる
         return(new NullLiteral());
     }
 }
예제 #6
0
        protected virtual Expr Place(PlaceHolderExpr ph)
        {
            var placeHolderName = ph.LabelName;

            if (!_placeHolders.ContainsKey(placeHolderName))
            {
                return(ph);
            }
            var placeHolderValue = _placeHolders[placeHolderName];

            if (placeHolderValue is Predicate)
            {
                throw new CannotBuildASTException("Type of placeholder value is mismatched.");
            }
            // 適用したプレースホルダを記録する
            if (!_placedHolders.ContainsKey(placeHolderName))
            {
                _placedHolders.Add(placeHolderName, placeHolderValue);
            }
            return((Expr)placeHolderValue);
        }
예제 #7
0
        public override void ExitPhExpr(MiniSqlParserParser.PhExprContext context)
        {
            var placeHolderNode =
                context.PLACEHOLDER1() != null?context.PLACEHOLDER1() : context.PLACEHOLDER2();

            var comments = this.GetComments(placeHolderNode);
            var name     = placeHolderNode.GetText();

            if (this.ForSqlAccessor)
            {
                if (name == "?")
                {
                    this.AddSqlAccessorSyntaxError("SqlPodではプレースホルダに'?'を使えません", context);
                }
                else if (name.StartsWith(":"))
                {
                    this.AddSqlAccessorSyntaxError("SqlPodではプレースホルダに':'を使えません", context);
                }
            }
            var node = new PlaceHolderExpr(name, comments);

            _stack.Push(node);
        }
예제 #8
0
 virtual public void Visit(PlaceHolderExpr expr)
 {
 }
 protected override IValue PlaceValue(PlaceHolderExpr ph)
 {
     // Value句にもNULL値を適用する
     return(new NullLiteral());
 }
        public override void Visit(PlaceHolderExpr expr)
        {
            var node = new PlaceHolderExpr(expr.Label, expr.Comments.Clone());

            _stack.Push(node);
        }
예제 #11
0
 virtual protected void VisitOnPlaceHolder(PlaceHolderExpr expr)
 {
 }
 protected override Expr Place(PlaceHolderExpr ph)
 {
     // NULL値は全てのPlaceHolderExprに適用できる
     return(new NullLiteral());
 }
예제 #13
0
 public override void Visit(PlaceHolderExpr expr)
 {
     this.GetPlaceHolderInfo(expr.LabelName);
 }