github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/pingcap/tidb/ast/flag_test.go (about)

     1  package ast_test
     2  
     3  import (
     4  	"testing"
     5  
     6  	. "github.com/insionng/yougam/libraries/pingcap/check"
     7  	"github.com/insionng/yougam/libraries/pingcap/tidb/ast"
     8  	"github.com/insionng/yougam/libraries/pingcap/tidb/parser"
     9  )
    10  
    11  func TestT(t *testing.T) {
    12  	TestingT(t)
    13  }
    14  
    15  var _ = Suite(&testFlagSuite{})
    16  
    17  type testFlagSuite struct {
    18  }
    19  
    20  func (ts *testFlagSuite) TestHasAggFlag(c *C) {
    21  	expr := &ast.BetweenExpr{}
    22  	cases := []struct {
    23  		flag   uint64
    24  		hasAgg bool
    25  	}{
    26  		{ast.FlagHasAggregateFunc, true},
    27  		{ast.FlagHasAggregateFunc | ast.FlagHasVariable, true},
    28  		{ast.FlagHasVariable, false},
    29  	}
    30  	for _, ca := range cases {
    31  		expr.SetFlag(ca.flag)
    32  		c.Assert(ast.HasAggFlag(expr), Equals, ca.hasAgg)
    33  	}
    34  }
    35  
    36  func (ts *testFlagSuite) TestFlag(c *C) {
    37  	cases := []struct {
    38  		expr string
    39  		flag uint64
    40  	}{
    41  		{
    42  			"1 between 0 and 2",
    43  			ast.FlagConstant,
    44  		},
    45  		{
    46  			"case 1 when 1 then 1 else 0 end",
    47  			ast.FlagConstant,
    48  		},
    49  		{
    50  			"case 1 when 1 then 1 else 0 end",
    51  			ast.FlagConstant,
    52  		},
    53  		{
    54  			"1 = ANY (select 1) OR exists (select 1)",
    55  			ast.FlagHasSubquery,
    56  		},
    57  		{
    58  			"1 in (1) or 1 is true or null is null or 'abc' like 'abc' or 'abc' rlike 'abc'",
    59  			ast.FlagConstant,
    60  		},
    61  		{
    62  			"row (1, 1) = row (1, 1)",
    63  			ast.FlagConstant,
    64  		},
    65  		{
    66  			"(1 + a) > ?",
    67  			ast.FlagHasReference | ast.FlagHasParamMarker,
    68  		},
    69  		{
    70  			"trim('abc ')",
    71  			ast.FlagHasFunc,
    72  		},
    73  		{
    74  			"now() + EXTRACT(YEAR FROM '2009-07-02') + CAST(1 AS UNSIGNED)",
    75  			ast.FlagHasFunc,
    76  		},
    77  		{
    78  			"substring('abc', 1)",
    79  			ast.FlagHasFunc,
    80  		},
    81  		{
    82  			"sum(a)",
    83  			ast.FlagHasAggregateFunc | ast.FlagHasReference,
    84  		},
    85  		{
    86  			"(select 1) as a",
    87  			ast.FlagHasSubquery,
    88  		},
    89  		{
    90  			"@auto_commit",
    91  			ast.FlagHasVariable,
    92  		},
    93  		{
    94  			"default(a)",
    95  			ast.FlagHasDefault,
    96  		},
    97  	}
    98  	for _, ca := range cases {
    99  		stmt, err := parser.ParseOneStmt("select "+ca.expr, "", "")
   100  		c.Assert(err, IsNil)
   101  		selectStmt := stmt.(*ast.SelectStmt)
   102  		ast.SetFlag(selectStmt)
   103  		expr := selectStmt.Fields.Fields[0].Expr
   104  		c.Assert(expr.GetFlag(), Equals, ca.flag, Commentf("For %s", ca.expr))
   105  	}
   106  }