예제 #1
0
        public void testEmbeddedVariable_inside()
        {
            var parameters = new List <ParameterEmulator>();

            parameters.Add(new ParameterEmulator
            {
                Name = "name", ParameterType = typeof(string), ParameterValue = "hoge"
            });
            parameters.Add(new ParameterEmulator
            {
                Name = "salary", ParameterType = typeof(int), ParameterValue = 10000
            });
            parameters.Add(new ParameterEmulator
            {
                Name = "table", ParameterType = typeof(string), ParameterValue = "aaa"
            });
            var testSql = "select * from /*# table */ where ename = /*name*/'aaa' and sal = /*salary*/-2000";
            var parser  = new DomaSqlParser(testSql);
            var node    = parser.Parse();
            var builder = new DomaSqlBuilder(node, parameters);
            var result  = builder.Build();

            result.ParsedSql.Is("select * from aaa where ename = @name and sal = @salary");
            result.DebugSql.Is("select * from aaa where ename = 'hoge' and sal = 10000");
            result.DbDataParameters.Count.Is(2);
            result.DbDataParameters[0].Value.Is("hoge");
            result.DbDataParameters[1].Value.Is(10000);
        }
예제 #2
0
        public void testValidate_enclosedParensByIfBlock()
        {
            var parser = new DomaSqlParser("select * from /*%if true*/(select * from bbb)/*%end*/");
            var node   = parser.Parse();

            node.IsNotNull();
        }
예제 #3
0
        public void testSelect()
        {
            var parameters = new List <ParameterEmulator>();

            parameters.Add(new ParameterEmulator
            {
                Name = "name", ParameterType = typeof(string), ParameterValue = "hoge"
            });
            parameters.Add(new ParameterEmulator
            {
                Name = "count", ParameterType = typeof(int), ParameterValue = 5
            });
            var testSql =
                "select aaa.deptname, count(*) from aaa join bbb on aaa.id = bbb.id where aaa.name = /*name*/'ccc' group by aaa.deptname having count(*) > /*count*/10 order by aaa.name for update bbb";
            var parser  = new DomaSqlParser(testSql);
            var node    = parser.Parse();
            var builder = new DomaSqlBuilder(node, parameters);
            var result  = builder.Build();

            result.ParsedSql.Is("select aaa.deptname, count(*) from aaa join bbb on aaa.id = bbb.id where aaa.name = @name group by aaa.deptname having count(*) > @count order by aaa.name for update bbb");
            result.DebugSql.Is("select aaa.deptname, count(*) from aaa join bbb on aaa.id = bbb.id where aaa.name = 'hoge' group by aaa.deptname having count(*) > 5 order by aaa.name for update bbb");
            result.DbDataParameters.Count.Is(2);
            result.DbDataParameters[0].Value.Is("hoge");
            result.DbDataParameters[1].Value.Is(5);
        }
예제 #4
0
        internal ISqlNode PrepareParse()
        {
            if (!File.Exists(_sqlFilePath))
            {
                throw new InvalidSqlFileException(ExceptionMessageId.EspC001, _sqlFilePath);
            }

            var rawSql = File.ReadAllText(_sqlFilePath);

            if (string.IsNullOrWhiteSpace(rawSql))
            {
                throw new InvalidSqlFileException(ExceptionMessageId.EspC002, _sqlFilePath);
            }
            if (_config == null)
            {
                throw new InvalidSqlParserConfigException(ExceptionMessageId.EspD001);
            }

            if (_config.DbConnectionKind == DbConnectionKind.Unknown)
            {
                throw new InvalidSqlParserConfigException(ExceptionMessageId.EspD002);
            }

            if (_config.DataParameterCreator == null)
            {
                throw new InvalidSqlParserConfigException(ExceptionMessageId.EspD003);
            }

            _evaluator = new EasyExpressionEvaluator(_sqlFilePath);

            ISqlNode sqlNode  = null;
            var      hasCache = false;

            if (ConfigContainer.EnableCache)
            {
                if (SqlCache.TryGetValue(_sqlFilePath, out SqlFileInfo info))
                {
                    sqlNode  = info.SqlNode;
                    hasCache = true;
                }
            }

            if (!hasCache)
            {
                var parser = new DomaSqlParser(rawSql);
                sqlNode = parser.Parse();
                if (ConfigContainer.EnableCache)
                {
                    var info = new SqlFileInfo
                    {
                        FilePath = _sqlFilePath,
                        RawSql   = rawSql,
                        SqlNode  = sqlNode
                    };
                    SqlCache.TryAdd(_sqlFilePath, info);
                }
            }

            return(sqlNode);
        }
예제 #5
0
        public void testUpdate()
        {
            var parameters = new List <ParameterEmulator>();

            parameters.Add(new ParameterEmulator
            {
                Name = "no", ParameterType = typeof(int), ParameterValue = 10
            });
            parameters.Add(new ParameterEmulator
            {
                Name = "name", ParameterType = typeof(string), ParameterValue = "hoge"
            });
            parameters.Add(new ParameterEmulator
            {
                Name = "id", ParameterType = typeof(int), ParameterValue = 100
            });
            var testSql = "update aaa set no = /*no*/1, set name = /*name*/'name' where id = /*id*/1";
            var parser  = new DomaSqlParser(testSql);
            var node    = parser.Parse();
            var builder = new DomaSqlBuilder(node, parameters);
            var result  = builder.Build();

            result.ParsedSql.Is("update aaa set no = @no, set name = @name where id = @id");
            result.DebugSql.Is("update aaa set no = 10, set name = 'hoge' where id = 100");
            result.DbDataParameters.Count.Is(3);
            result.DbDataParameters[0].Value.Is(10);
            result.DbDataParameters[1].Value.Is("hoge");
            result.DbDataParameters[2].Value.Is(100);
        }
예제 #6
0
        public void testValidate_unclosedParens()
        {
            var parser = new DomaSqlParser("select * from (select * from bbb");
            var ex     = Assert.Throws <SqlParseException>(() => parser.Parse());

            ex.MessageId.Is(ExceptionMessageId.Esp2135);
        }
예제 #7
0
        public void testValidate_ifEnd_subquery()
        {
            var parser = new DomaSqlParser("select *, (select /*%if true */ from aaa) x from aaa");
            var ex     = Assert.Throws <SqlParseException>(() => parser.Parse());

            ex.MessageId.Is(ExceptionMessageId.Esp2133);
        }
예제 #8
0
        public void BuiltinFunctionArgsCountTooMany()
        {
            var testSql = "select * from aaa where birthDate > /* @TruncateTime(birthDate, '!') */'1999-10-12'";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <SqlParseException>(() => parser.Parse());

            ex.MessageId.Is(ExceptionMessageId.Esp2151);
        }
예제 #9
0
        public void InvalidEscapeChar2()
        {
            var testSql = "select * from aaa where birthDate > /* @StartsWith(birthDate, '!!) */'1999-10-12'";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <SqlParseException>(() => parser.Parse());

            ex.MessageId.Is(ExceptionMessageId.Esp2152);
        }
예제 #10
0
        public void testValidate_forEnd()
        {
            var testSql = "select * from aaa /*%for name : names*/";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <UnsupportedSqlCommentException>(() => parser.Parse());

            ex.IsNotNull();
        }
예제 #11
0
        public void UnknownBuiltinFunction()
        {
            var testSql = "select * from aaa where birthDate > /* @Dummy(birthDate) */'1999-10-12'";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <SqlParseException>(() => parser.Parse());

            ex.MessageId.Is(ExceptionMessageId.Esp2150);
        }
예제 #12
0
        public void testPopulate()
        {
            var testSql = "update employee set /*%populate*/ id = id where age < 30";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <UnsupportedSqlCommentException>(() => parser.Parse());

            ex.IsNotNull();
        }
예제 #13
0
        public void testBindVariable_nullLiteral()
        {
            var testSql = "select * from aaa where ename = /*name*/null";
            var parser  = new DomaSqlParser(testSql);
            var node    = parser.Parse();

            node.IsNotNull();
        }
예제 #14
0
        public void testLiteralVariable_illegalLiteral()
        {
            var testSql = "select * from aaa where ename = /*^name*/bbb";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <SqlParseException>(() => parser.Parse());

            ex.MessageId.Is(ExceptionMessageId.Esp2142);
        }
예제 #15
0
        public void testManyEol()
        {
            var sql    = File.ReadAllText("manyEol.sql");
            var parser = new DomaSqlParser(sql);
            var node   = parser.Parse();

            node.IsNotNull();
        }
예제 #16
0
        public void testExpand_word()
        {
            var testSql = "select /*%expand*/'hoge' from aaa";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <UnsupportedSqlCommentException>(() => parser.Parse());

            ex.IsNotNull();
        }
예제 #17
0
        public void testFor_index()
        {
            var testSql = "select * from aaa where /*%for n : names*/name/*# n_index */ = /*n*/'a' /*%if n_has_next */or /*%end*//*%end*/";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <UnsupportedSqlCommentException>(() => parser.Parse());

            ex.IsNotNull();
        }
예제 #18
0
        public void testEmbeddedVariable_emptyName()
        {
            var testSql = "select * from aaa where ename = /*#   */'aaa'";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <SqlParseException>(() => parser.Parse());

            ex.MessageId.Is(ExceptionMessageId.Esp2121);
        }
예제 #19
0
        public void testOrderByClauseUnspecified()
        {
            var transformer = new StandardPagingTransformer(5, 10, null);
            var parser      = new DomaSqlParser("select * from emp");
            var ex          = Assert.Throws <SqlTransformException>(() => transformer.Transform(parser.Parse()));

            ex.IsNotNull();
            ex.MessageId.Is(ExceptionMessageId.Esp2201);
        }
예제 #20
0
        public void testEmptyParens_whiteSpace()
        {
            var parameters = new List <ParameterEmulator>();
            var parser     = new DomaSqlParser("select rank(   )");
            var node       = parser.Parse();
            var builder    = new DomaSqlBuilder(node, parameters);
            var result     = builder.Build();

            result.ParsedSql.Is("select rank(   )");
        }
예제 #21
0
        public void testUnion()
        {
            var parameters = new List <ParameterEmulator>();
            var testSql    = "select * from aaa where /*%if false*//*%end*/union all select * from bbb";
            var parser     = new DomaSqlParser(testSql);
            var node       = parser.Parse();
            var builder    = new DomaSqlBuilder(node, parameters);
            var result     = builder.Build();

            result.ParsedSql.Is("select * from aaa union all select * from bbb");
        }
예제 #22
0
        public void testOrderBy()
        {
            var expected    = "select count(*) from ( select * from emp ) t_";
            var transformer = new StandardCountGettingTransformer();
            var parser      = new DomaSqlParser("select * from emp order by emp.id");
            var node        = transformer.Transform(parser.Parse());
            var parameters  = new List <ParameterEmulator>();
            var builder     = new DomaSqlBuilder(node, parameters, _config);
            var result      = builder.Build();

            result.ParsedSql.Is(expected);
        }
예제 #23
0
        public void testLimitOnly()
        {
            var expected    = "select emp.id from emp order by emp.id fetch first 10 rows only";
            var transformer = new Db2PagingTransformer(-1, 10, null);
            var parser      = new DomaSqlParser("select emp.id from emp order by emp.id");
            var node        = transformer.Transform(parser.Parse());
            var parameters  = new List <ParameterEmulator>();
            var builder     = new DomaSqlBuilder(node, parameters, _config);
            var result      = builder.Build();

            result.ParsedSql.Is(expected);
        }
예제 #24
0
        public void testLimitOnly()
        {
            var expected    = "select sql_calc_found_rows * from emp order by emp.id limit 0, 10";
            var transformer = new MysqlPagingTransformer(-1, 10, null);
            var parser      = new DomaSqlParser("select * from emp order by emp.id");
            var node        = transformer.Transform(parser.Parse());
            var parameters  = new List <ParameterEmulator>();
            var builder     = new DomaSqlBuilder(node, parameters, _config);
            var result      = builder.Build();

            result.ParsedSql.Is(expected);
        }
예제 #25
0
        public void testOffsetOnly()
        {
            var expected    = "select * from emp order by emp.id limit 9223372036854775807 offset 5";
            var transformer = new SqlitePagingTransformer(5, -1, null);
            var parser      = new DomaSqlParser("select * from emp order by emp.id");
            var node        = transformer.Transform(parser.Parse());
            var parameters  = new List <ParameterEmulator>();
            var builder     = new DomaSqlBuilder(node, parameters, _config);
            var result      = builder.Build();

            result.ParsedSql.Is(expected);
        }
예제 #26
0
        public void testOffsetLimit_forUpdate()
        {
            var expected    = "select * from emp order by emp.id  limit 10 offset 5 for update";
            var transformer = new SqlitePagingTransformer(5, 10, null);
            var parser      = new DomaSqlParser("select * from emp order by emp.id for update");
            var node        = transformer.Transform(parser.Parse());
            var parameters  = new List <ParameterEmulator>();
            var builder     = new DomaSqlBuilder(node, parameters, _config);
            var result      = builder.Build();

            result.ParsedSql.Is(expected);
        }
예제 #27
0
        public void testOffsetOnly()
        {
            var expected =
                "select * from ( select temp_.*, rownum esp_rownumber_ from ( select * from emp order by emp.id ) temp_ ) where esp_rownumber_ > 5";
            var transformer = new OraclePagingTransformer(5, -1, null);
            var parser      = new DomaSqlParser("select * from emp order by emp.id");
            var node        = transformer.Transform(parser.Parse());
            var parameters  = new List <ParameterEmulator>();
            var builder     = new DomaSqlBuilder(node, parameters, _config);
            var result      = builder.Build();

            result.ParsedSql.Is(expected);
        }
        public void testOffsetLimit_option()
        {
            var expected =
                "select emp.id from emp order by emp.id  offset 5 rows fetch next 10 rows only option (maxrecursion 0)";
            var transformer = new MssqlPagingTransformer(5, 10, false, null);
            var parser      = new DomaSqlParser("select emp.id from emp order by emp.id option (maxrecursion 0)");
            var node        = transformer.Transform(parser.Parse());
            var parameters  = new List <ParameterEmulator>();
            var builder     = new DomaSqlBuilder(node, parameters, _config);
            var result      = builder.Build();

            result.ParsedSql.Is(expected);
        }
예제 #29
0
        public void testLimitOnly()
        {
            var expected =
                "select * from ( select temp_.*, row_number() over( order by temp_.id ) as esp_rownumber_ from ( select emp.id from emp ) as temp_ ) as temp2_ where esp_rownumber_ <= 10";
            var transformer = new StandardPagingTransformer(-1, 10, null);
            var parser      = new DomaSqlParser("select emp.id from emp order by emp.id");
            var node        = transformer.Transform(parser.Parse());
            var parameters  = new List <ParameterEmulator>();
            var builder     = new DomaSqlBuilder(node, parameters, _config);
            var result      = builder.Build();

            result.ParsedSql.Is(expected);
        }
예제 #30
0
        public void testLiteralVariable_endsWithLiteralVariableComment()
        {
            var parameters = new List <ParameterEmulator>();

            parameters.Add(new ParameterEmulator
            {
                Name = "name", ParameterType = typeof(string), ParameterValue = "hoge"
            });
            var testSql = "select * from aaa where ename = /*^name*/";
            var parser  = new DomaSqlParser(testSql);
            var ex      = Assert.Throws <SqlParseException>(() => parser.Parse());

            ex.MessageId.Is(ExceptionMessageId.Esp2110);
        }