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); }
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); } }
private Expr PlaceInBitwiseNot(PlaceHolderExpr ph) { var expr = this.Place(ph); if (expr.GetType() == typeof(BinaryOpExpr)) { expr = new BracketedExpr(expr); } return(expr); }
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()); } }
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); }
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); }
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); }
virtual protected void VisitOnPlaceHolder(PlaceHolderExpr expr) { }
protected override Expr Place(PlaceHolderExpr ph) { // NULL値は全てのPlaceHolderExprに適用できる return(new NullLiteral()); }
public override void Visit(PlaceHolderExpr expr) { this.GetPlaceHolderInfo(expr.LabelName); }