コード例 #1
0
        public void SelectClause_UnaryOperator()
        {
            using (StringReader reader = new StringReader(
                       @"SELECT
					+1;"                    ))
                using (ITSQLTokenizer tokenizer = new TSQLTokenizer(reader))
                {
                    Assert.IsTrue(tokenizer.MoveNext());

                    TSQLSelectClause select = new TSQLSelectClauseParser().Parse(tokenizer);
                    Assert.AreEqual(3, select.Tokens.Count);
                    Assert.IsTrue(tokenizer.Current.IsCharacter(TSQLCharacters.Semicolon));

                    Assert.AreEqual(1, select.Columns.Count);

                    TSQLSelectColumn column = select.Columns[0];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.Operator, column.Expression.Type);

                    TSQLOperatorExpression tsqlOperator = column.Expression.AsOperator;

                    Assert.AreEqual("+", tsqlOperator.Operator.Text);
                    Assert.IsNull(tsqlOperator.LeftSide);

                    Assert.AreEqual(TSQLExpressionType.Constant, tsqlOperator.RightSide.Type);
                    Assert.AreEqual(1, tsqlOperator.RightSide.AsConstant.Literal.AsNumericLiteral.Value);
                }
        }
コード例 #2
0
        public void SelectClause_VariableAssignment()
        {
            using (StringReader reader = new StringReader(
                       @"SELECT @id = p.ProductID
				FROM Production.Product p
				WHERE
					p.[Name] = 'Blade';"                    ))
                using (ITSQLTokenizer tokenizer = new TSQLTokenizer(reader))
                {
                    Assert.IsTrue(tokenizer.MoveNext());

                    TSQLSelectClause select = new TSQLSelectClauseParser().Parse(tokenizer);
                    Assert.AreEqual(6, select.Tokens.Count);
                    Assert.AreEqual(TSQLKeywords.FROM, tokenizer.Current.AsKeyword.Keyword);

                    Assert.AreEqual(1, select.Columns.Count);

                    TSQLSelectColumn column = select.Columns[0];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.VariableAssignment, column.Expression.Type);

                    TSQLVariableAssignmentExpression assignmentExpression = column.Expression.AsVariableAssignment;
                    Assert.AreEqual("=", assignmentExpression.Operator.Text);

                    Assert.AreEqual("@id", assignmentExpression.Variable.Text);

                    TSQLColumnExpression columnExpression = assignmentExpression.ValueExpression.AsColumn;
                    Assert.AreEqual("p", columnExpression.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("ProductID", columnExpression.Column.Name);
                }
        }
コード例 #3
0
        public void SelectStatement_CommonSelect()
        {
            List <TSQLStatement> statements = TSQLStatementReader.ParseStatements(
                @"select t.a, t.b, (select 1) as e
				into #tempt
				from
					[table] t
						inner join [table] t2 on
							t.id = t2.id
				where
					t.c = 5
				group by
					t.a,
					t.b
				having
					count(*) > 1
				order by
					t.a,
					t.b;"                    ,
                includeWhitespace: true);
            TSQLSelectStatement select = statements[0] as TSQLSelectStatement;

            Assert.IsNotNull(statements);
            Assert.AreEqual(1, statements.Count);
            Assert.AreEqual(TSQLStatementType.Select, statements[0].Type);
            Assert.AreEqual(98, select.Tokens.Count);
            Assert.AreEqual(TSQLKeywords.SELECT, select.Tokens[0].AsKeyword.Keyword);
            TSQLSelectClause selectClause = select.Select;

            Assert.AreEqual(3, selectClause.Columns.Count);
            TSQLSelectColumn column = selectClause.Columns[0];

            Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
            Assert.AreEqual("t", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
            Assert.AreEqual("a", column.Expression.AsColumn.Column.Name);
            column = selectClause.Columns[1];
            Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
            Assert.AreEqual("t", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
            Assert.AreEqual("b", column.Expression.AsColumn.Column.Name);
            column = selectClause.Columns[2];
            Assert.AreEqual("e", column.ColumnAlias.AsIdentifier.Name);
            Assert.AreEqual(TSQLExpressionType.Subquery, column.Expression.Type);
            TSQLSubqueryExpression subquery = column.Expression.AsSubquery;

            Assert.AreEqual(1, subquery.Select.Select.Columns.Count);
            Assert.AreEqual(1, subquery.Select.Select.Columns[0].Expression.AsConstant.Literal.AsNumericLiteral.Value);
            Assert.AreEqual(" ", select.Tokens[1].AsWhitespace.Text);
            Assert.AreEqual("t", select.Tokens[2].AsIdentifier.Name);
            Assert.AreEqual(TSQLCharacters.Period, select.Tokens[3].AsCharacter.Character);
            Assert.AreEqual(22, select.Select.Tokens.Count);
            Assert.AreEqual(4, select.Into.Tokens.Count);
            Assert.AreEqual(26, select.From.Tokens.Count);
            Assert.AreEqual(10, select.Where.Tokens.Count);
            Assert.AreEqual(13, select.GroupBy.Tokens.Count);
            Assert.AreEqual(11, select.Having.Tokens.Count);
            Assert.AreEqual(12, select.OrderBy.Tokens.Count);
            Assert.AreEqual(3, select.Select.Columns.Count);
            Assert.AreEqual("e", select.Select.Columns[2].ColumnAlias.Text);
        }
コード例 #4
0
        public void SelectClause_FullyQualifiedFunction()
        {
            using (StringReader reader = new StringReader(
                       @"SELECT
					p.ProductID, 
					p.[Name],
					Test.dbo.Multiply(p.SafetyStockLevel, p.StandardCost) AS RestockCost
				FROM
					Production.Product p
				ORDER BY
					p.[Name];"                    ))
                using (ITSQLTokenizer tokenizer = new TSQLTokenizer(reader))
                {
                    Assert.IsTrue(tokenizer.MoveNext());

                    TSQLSelectClause select = new TSQLSelectClauseParser().Parse(tokenizer);
                    Assert.AreEqual(25, select.Tokens.Count);
                    Assert.AreEqual(TSQLKeywords.FROM, tokenizer.Current.AsKeyword.Keyword);

                    Assert.AreEqual(3, select.Columns.Count);

                    TSQLSelectColumn column = select.Columns[0];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("ProductID", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[1];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("Name", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[2];

                    Assert.AreEqual("RestockCost", column.ColumnAlias.Name);
                    Assert.AreEqual(TSQLExpressionType.Function, column.Expression.Type);

                    TSQLFunctionExpression functionExpression = column.Expression.AsFunction;

                    Assert.AreEqual("Multiply", functionExpression.Function.Name);
                    Assert.AreEqual(3, functionExpression.QualifiedPath.Count);
                    Assert.AreEqual("Test", functionExpression.QualifiedPath[0].AsIdentifier.Name);
                    Assert.AreEqual(".", functionExpression.QualifiedPath[1].AsCharacter.Text);
                    Assert.AreEqual("dbo", functionExpression.QualifiedPath[2].AsIdentifier.Name);

                    TSQLColumnExpression argumentExpression = functionExpression.Arguments[0].AsColumn;
                    Assert.AreEqual("p", argumentExpression.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("SafetyStockLevel", argumentExpression.Column.Name);

                    argumentExpression = functionExpression.Arguments[1].AsColumn;
                    Assert.AreEqual("p", argumentExpression.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("StandardCost", argumentExpression.Column.Name);
                }
        }
コード例 #5
0
        public void SelectStatement_CountAliasWithWhitespace()
        {
            List <TSQLStatement> statements = TSQLStatementReader.ParseStatements(
                @"SELECT COUNT ( * ) as count FROM sqlite_master",
                includeWhitespace: true);

            TSQLSelectColumn count = statements
                                     .Single()
                                     .AsSelect
                                     .Select
                                     .Columns
                                     .Single();

            Assert.AreEqual("COUNT", count.Expression.AsFunction.Function.Name);
            Assert.AreEqual("count", count.ColumnAlias.Name);
        }
コード例 #6
0
        public void SelectClause_WindowedAggregate()
        {
            using (StringReader reader = new StringReader(
                       @"SELECT
					p.ProductID,
					p.[Name],
					ROW_NUMBER() OVER (
						PARTITION BY 
							p.DaysToManufacture 
						ORDER BY 
							p.[Name]) AS GroupNumber
				FROM
					Production.Product p
				ORDER BY
					p.DaysToManufacture,
					p.[Name];"                    ))
                using (ITSQLTokenizer tokenizer = new TSQLTokenizer(reader))
                {
                    Assert.IsTrue(tokenizer.MoveNext());

                    TSQLSelectClause select = new TSQLSelectClauseParser().Parse(tokenizer);
                    Assert.AreEqual(27, select.Tokens.Count);
                    Assert.AreEqual(TSQLKeywords.FROM, tokenizer.Current.AsKeyword.Keyword);

                    Assert.AreEqual(3, select.Columns.Count);

                    TSQLSelectColumn column = select.Columns[0];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("ProductID", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[1];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("Name", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[2];

                    Assert.AreEqual("GroupNumber", column.ColumnAlias.Name);
                    Assert.AreEqual(TSQLExpressionType.Function, column.Expression.Type);
                    Assert.AreEqual("ROW_NUMBER", column.Expression.AsFunction.Function.Name);
                }
        }
コード例 #7
0
        public void SelectStatement_CaseInSelect()
        {
            string query = "SELECT Value, CASE WHEN Value = 1 THEN 'One' ELSE 'Other' END AS Cased FROM SomeTable";

            var statements = TSQLStatementReader.ParseStatements(query, includeWhitespace: false);

            Assert.AreEqual(1, statements.Count);

            TSQLSelectStatement select = statements[0] as TSQLSelectStatement;

            Assert.AreEqual(15, select.Select.Tokens.Count);
            Assert.AreEqual(2, select.Select.Columns.Count);
            Assert.AreEqual("Value", select.Select.Columns[0].Expression.AsColumn.Column.Name);
            TSQLSelectColumn column = select.Select.Columns[1];

            Assert.AreEqual("Cased", column.ColumnAlias.AsIdentifier.Name);
            Assert.AreEqual(TSQLExpressionType.Case, column.Expression.Type);
            Assert.AreEqual(2, select.From.Tokens.Count);
            Assert.AreEqual("FROM SomeTable",
                            query.Substring(
                                select.From.BeginPosition,
                                select.From.Length));
            Assert.AreEqual(2, select.Select.Columns.Count);
        }
コード例 #8
0
        public TSQLSelectColumn Parse(ITSQLTokenizer tokenizer)
        {
            TSQLSelectColumn column = new TSQLSelectColumn();

            TSQLExpression columnExpression = new TSQLSelectExpressionParser().Parse(tokenizer);

            column.Expression = columnExpression;

            column.Tokens.AddRange(columnExpression.Tokens);

            TSQLTokenParserHelper.ReadCommentsAndWhitespace(
                tokenizer,
                column);

            // check for operator =, when expression type is column, and return new column expression with alias
            // e.g. IsFinishedGoods = p.FinishedGoodsFlag

            if (
                tokenizer.Current != null &&
                tokenizer.Current.Type == TSQLTokenType.Operator &&
                tokenizer.Current.Text == "=" &&
                columnExpression.Type == TSQLExpressionType.Column
                )
            {
                column.Tokens.Add(tokenizer.Current);

                tokenizer.MoveNext();

                TSQLExpression actualColumn = new TSQLValueExpressionParser().Parse(tokenizer);

                column.Expression  = actualColumn;
                column.ColumnAlias = columnExpression.AsColumn.Column;

                column.Tokens.AddRange(actualColumn.Tokens);
            }
            else
            {
                if (tokenizer.Current.IsKeyword(TSQLKeywords.AS))
                {
                    column.Tokens.Add(tokenizer.Current);

                    tokenizer.MoveNext();

                    TSQLTokenParserHelper.ReadCommentsAndWhitespace(
                        tokenizer,
                        column);
                }

                if (tokenizer.Current != null &&
                    tokenizer.Current.Type.In(
                        TSQLTokenType.Identifier,
                        TSQLTokenType.SystemIdentifier,
                        TSQLTokenType.IncompleteIdentifier))
                {
                    column.Tokens.Add(tokenizer.Current);

                    if (tokenizer.Current.Type.In(
                            TSQLTokenType.Identifier,
                            TSQLTokenType.SystemIdentifier))
                    {
                        column.ColumnAlias = tokenizer.Current.AsIdentifier;
                    }

                    tokenizer.MoveNext();
                }
            }

            return(column);
        }
コード例 #9
0
        public void SelectClause_ColumnAliasSyntaxes()
        {
            using (StringReader reader = new StringReader(
                       @"SELECT
					ProductID,
					p.[Name],
					p.ProductNumber [Number],
					p.MakeFlag AS IsMake,
					IsFinishedGoods = p.FinishedGoodsFlag,
					@Category AS ProductCategory,
					p.*
				FROM
					Production.Product p;"                    ))
                using (ITSQLTokenizer tokenizer = new TSQLTokenizer(reader))
                {
                    Assert.IsTrue(tokenizer.MoveNext());

                    TSQLSelectClause select = new TSQLSelectClauseParser().Parse(tokenizer);
                    Assert.AreEqual(31, select.Tokens.Count);
                    Assert.AreEqual(TSQLKeywords.FROM, tokenizer.Current.AsKeyword.Keyword);

                    Assert.AreEqual(7, select.Columns.Count);

                    TSQLSelectColumn column = select.Columns[0];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.IsNull(column.Expression.AsColumn.TableReference);
                    Assert.AreEqual("ProductID", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[1];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("Name", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[2];

                    Assert.AreEqual("Number", column.ColumnAlias.Name);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("ProductNumber", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[3];

                    Assert.AreEqual("IsMake", column.ColumnAlias.Name);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("MakeFlag", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[4];

                    Assert.AreEqual("IsFinishedGoods", column.ColumnAlias.Name);
                    Assert.AreEqual(TSQLExpressionType.Column, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsColumn.TableReference.Single().AsIdentifier.Name);
                    Assert.AreEqual("FinishedGoodsFlag", column.Expression.AsColumn.Column.Name);

                    column = select.Columns[5];

                    Assert.AreEqual("ProductCategory", column.ColumnAlias.Name);
                    Assert.AreEqual(TSQLExpressionType.Variable, column.Expression.Type);
                    Assert.AreEqual("@Category", column.Expression.AsVariable.Variable.Text);

                    column = select.Columns[6];

                    Assert.IsNull(column.ColumnAlias);
                    Assert.AreEqual(TSQLExpressionType.Multicolumn, column.Expression.Type);
                    Assert.AreEqual("p", column.Expression.AsMulticolumn.TableReference.Single().AsIdentifier.Name);
                }
        }