public void ShouldResolveUpdateStatement()
        {
            //Arrange
            string rawTsql = "update someFactTable " +
                             "set somecolumn = nil.col_01, someOtherColumn = [dbo].gl.col_02 " +
                             "from DWH_DB.[dbo].[someFactTable]";

            IDataManipulationResolver resolver = new UpdateStatementResolver();
            int                      fileIndex = 0;
            CompilerContext          context   = new CompilerContext("xUnit", "stdserver", "stdDatabase", true);
            ReadOnlySpan <TSQLToken> tokens    = TSQLTokenizer.ParseTokens(rawTsql).ToArray();

            //Act
            DataManipulation statement = resolver.Resolve(tokens, ref fileIndex, context);

            //Assert
            Assert.Equal(tokens.Length, fileIndex);
            Assert.Equal(2, statement.Expressions.Count);
            Assert.Equal(ExpressionType.COLUMN, statement.Expressions[0].Type);
            Assert.Equal("DWH_DB.dbo.someFactTable.somecolumn", statement.Expressions[0].Name);
            Assert.Equal("stdDatabase.unrelated.nil.col_01", statement.Expressions[0].ChildExpressions[0].Name);
            Assert.Equal(ExpressionType.COLUMN, statement.Expressions[1].Type);
            Assert.Equal("DWH_DB.dbo.someFactTable.someOtherColumn", statement.Expressions[1].Name);
            Assert.Equal("stdDatabase.dbo.gl.col_02", statement.Expressions[1].ChildExpressions[0].Name);
        }
Example #2
0
        public void ShouldResolveRecursiveCaseStatement()
        {
            //Arrange
            string rawTsql = " CASE                                                    " +
                             "   WHEN someValue > anotherValue THEN                    " +
                             "      CASE                                               " +
                             "         WHEN NullIf(val_01,0) IS NULL THEN NULL         " +
                             "         WHEN NullIf(val_02,0) IS NULL THEN Null         " +
                             "         WHEN(100 / val_02 * val_01) <= 100 THEN 'Green' " +
                             "         WHEN 100 + 25 <= 125 THEN 'Yellow'" +
                             "         ELSE 'Red'                                      " +
                             "      END                                                " +
                             "   ELSE                                                  " +
                             "      CASE                                               " +
                             "         WHEN NULLIF(val_03, 0) IS NULL THEN NULL        " +
                             "         WHEN NullIf(val_02,0) IS NULL THEN NULL         " +
                             "         WHEN(100 / val_02 * val_03) <= 100 THEN 'Green' " +
                             "         WHEN(100 / val_02 * val_03) <= 125 THEN 'Yellow'" +
                             "         ELSE 'Red'                                      " +
                             "      END                                                " +
                             " END";

            IExpressionResolver resolver       = new CaseStatementResolver();
            int                      fileIndex = 0;
            CompilerContext          context   = new CompilerContext("xUnit", "stdserver", "stdDatabase", true);
            ReadOnlySpan <TSQLToken> tokens    = TSQLTokenizer.ParseTokens(rawTsql).ToArray();

            //Act
            Expression expression = resolver.Resolve(tokens, ref fileIndex, context);

            //Assert
            Assert.Equal(tokens.Length, fileIndex);
        }
Example #3
0
        public void TestParseLines()
        {
            string file_string = @"zzz!10,NAV15BEO0Zll
before zzz!11,87NSZSSP4Jll
zzz!12,MZOTXUFT9Tll after
zzz!13,6DFOKC74ZGll
zzz!14,3KZ94GFGLZll
zzz!15,VQTMAXWCDKll";

            string[] expected =
            {
                "10,NAV15BEO0Z",
                "11,87NSZSSP4J",
                "12,MZOTXUFT9T",
                "13,6DFOKC74ZG",
                "14,3KZ94GFGLZ",
                "15,VQTMAXWCDK"
            };

            string           query  = "LOAD DATA LOCAL INFILE 'myfile.txt' INTO TABLE imptest FIELDS TERMINATED BY ',' LINES STARTING BY 'zzz!' TERMINATED BY 'll'";
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens(query);
            LoadDataParser   parser = new LoadDataParser(tokens);

            Assert.AreEqual("zzz!", parser.lines_starting_by);
            Assert.AreEqual("ll", parser.lines_terminated_by);

            string[] actual = ClientSession.ParseLines(file_string, parser);
            foreach (var a in actual)
            {
                Console.WriteLine(a);
            }
            Assert.IsTrue(actual.SequenceEqual(expected));
        }
        public void ShouldResolveUpdateStatementWithAliasTarget()
        {
            //Arrange
            string rawTsql = "update GL " +
                             "set somevalue = nil.col_01, someOtherValue = gl.col_02 " +
                             "from [SOME_table] nil " +
                             "inner join [dbo].[TABLE_02] GL";

            IDataManipulationResolver resolver = new UpdateStatementResolver();
            int                      fileIndex = 0;
            CompilerContext          context   = new CompilerContext("xUnit", "stdserver", "stdDatabase", true);
            ReadOnlySpan <TSQLToken> tokens    = TSQLTokenizer.ParseTokens(rawTsql).ToArray();

            //Act
            DataManipulation statement = resolver.Resolve(tokens, ref fileIndex, context);

            //Assert
            Assert.Equal(tokens.Length, fileIndex);
            Assert.Equal(ExpressionType.COLUMN, statement.Expressions[0].Type);
            Assert.Equal("stdDatabase.dbo.TABLE_02.somevalue", statement.Expressions[0].Name);
            Assert.Equal("stdDatabase.unrelated.SOME_table.col_01", statement.Expressions[0].ChildExpressions[0].Name);
            Assert.Equal(ExpressionType.COLUMN, statement.Expressions[1].Type);
            Assert.Equal("stdDatabase.dbo.TABLE_02.someOtherValue", statement.Expressions[1].Name);
            Assert.Equal("stdDatabase.dbo.TABLE_02.col_02", statement.Expressions[1].ChildExpressions[0].Name);
        }
Example #5
0
        public void Parse_GO()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("GO");

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLKeyword(0, "GO")
            },
                tokens);
        }
Example #6
0
        public void MoneyLiteral_ForeignNegative()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("£-.1 ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLMoneyLiteral(0, "£-.1"),
                new TSQLWhitespace(4, " ")
            },
                tokens);
        }
Example #7
0
        public void MoneyLiteral_StartingWithPeriod()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("$.1 ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLMoneyLiteral(0, "$.1"),
                new TSQLWhitespace(3, " ")
            },
                tokens);
        }
Example #8
0
        public void SingleLineCommentToken_LineFeed()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("--blah\n", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLSingleLineComment(0, "--blah"),
                new TSQLWhitespace(6, "\n")
            },
                tokens);
        }
        public void NumericLiteral_DecimalStartingWithPeriod()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens(".545878 ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLNumericLiteral(0, ".545878"),
                new TSQLWhitespace(7, " ")
            },
                tokens);
        }
        public void NumericLiteral_ComplicatedExponential()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("54.0e-4 ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLNumericLiteral(0, "54.0e-4"),
                new TSQLWhitespace(7, " ")
            },
                tokens);
        }
Example #11
0
        public void KeywordToken_SimpleKeywordLowercase()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("go ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLKeyword(0, "go"),
                new TSQLWhitespace(2, " ")
            },
                tokens);
        }
Example #12
0
        public void StringLiteralToken_DoubleQuote()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("\"name\" ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLStringLiteral(0, "\"name\""),
                new TSQLWhitespace(6, " ")
            },
                tokens);
        }
Example #13
0
        public void IdentifierToken_EscapedBracketedIdentifier2()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("[a]]a] ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLIdentifier(0, "[a]]a]"),
                new TSQLWhitespace(6, " ")
            },
                tokens);
        }
Example #14
0
        public void IdentifierToken_QuotedUnicodeIdentifier()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("N\"name\" ", useQuotedIdentifiers: true, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLIdentifier(0, "N\"name\""),
                new TSQLWhitespace(7, " ")
            },
                tokens);
        }
Example #15
0
        public void IdentifierToken_SimpleIdentifier()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("a ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLIdentifier(0, "a"),
                new TSQLWhitespace(1, " ")
            },
                tokens);
        }
Example #16
0
        public void IncompleteToken_Identifier()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("[dbo", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLIncompleteIdentifierToken(0, "[dbo")
            },
                tokens);
            Assert.IsFalse(tokens[0].IsComplete);
        }
Example #17
0
        public void IncompleteToken_Comment()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("/* something", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLIncompleteCommentToken(0, "/* something")
            },
                tokens);
            Assert.IsFalse(tokens[0].IsComplete);
        }
Example #18
0
        public void CharacterToken_Period()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens(". ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLCharacter(0, "."),
                new TSQLWhitespace(1, " ")
            },
                tokens);
        }
Example #19
0
        public void IncompleteToken_StringLiteral()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("'", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLIncompleteStringToken(0, "'")
            },
                tokens);
            Assert.IsFalse(tokens[0].IsComplete);
        }
Example #20
0
        public void BinaryToken_SimpleBinaryLiteral()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("0x69048AEFDD010E ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLBinaryLiteral(0, "0x69048AEFDD010E"),
                new TSQLWhitespace(16, " ")
            },
                tokens);
        }
Example #21
0
        public void BinaryToken_BinaryLiteralEndWithLetter()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("0x69048AEFDD010EJ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLBinaryLiteral(0, "0x69048AEFDD010E"),
                new TSQLIdentifier(16, "J")
            },
                tokens);
        }
Example #22
0
        public void Operator_NotEqualExclamation()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("!= ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLOperator(0, "!="),
                new TSQLWhitespace(2, " ")
            },
                tokens);
        }
Example #23
0
        public void BinaryToken_EmptyBinaryLiteralCaseInsensitive()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("0X ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLBinaryLiteral(0, "0X"),
                new TSQLWhitespace(2, " ")
            },
                tokens);
        }
Example #24
0
        public void Operator_LessThan()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("< ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLOperator(0, "<"),
                new TSQLWhitespace(1, " ")
            },
                tokens);
        }
Example #25
0
        public void MultilineCommentToken_RequireFullEnding()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("/*/ blah */ ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLMultilineComment(0, "/*/ blah */"),
                new TSQLWhitespace(11, " ")
            },
                tokens);
        }
Example #26
0
        public void StringLiteralToken_SingleQuoteUnicode()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("N'name' ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLStringLiteral(0, "N'name'"),
                new TSQLWhitespace(7, " ")
            },
                tokens);
        }
Example #27
0
        public void MultilineCommentToken_SpanLines()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("/* blah\r\nblah */ ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLMultilineComment(0, "/* blah\r\nblah */"),
                new TSQLWhitespace(16, " ")
            },
                tokens);
        }
Example #28
0
        public void StringLiteralToken_MultiLine()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("'a\r\nb' ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLStringLiteral(0, "'a\r\nb'"),
                new TSQLWhitespace(6, " ")
            },
                tokens);
            Assert.AreEqual("a\r\nb", tokens[0].AsStringLiteral.Value);
        }
Example #29
0
        public void BinaryToken_EmbeddedLineContinuation()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("0xabc\\\r\ndef ", includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLBinaryLiteral(0, "0xabc\\\r\ndef"),
                new TSQLWhitespace(11, " ")
            },
                tokens);
            Assert.AreEqual("0xABCDEF", tokens[0].AsBinaryLiteral.Value);
        }
Example #30
0
        public void IdentifierToken_BracketedMultiLine()
        {
            List <TSQLToken> tokens = TSQLTokenizer.ParseTokens("[a\r\nb] ", useQuotedIdentifiers: false, includeWhitespace: true);

            TokenComparisons.CompareTokenLists(
                new List <TSQLToken>()
            {
                new TSQLIdentifier(0, "[a\r\nb]"),
                new TSQLWhitespace(6, " ")
            },
                tokens);
            Assert.AreEqual("a\r\nb", tokens[0].AsIdentifier.Name);
        }