Example #1
0
        public IExpression Parse(TextSpan token, IParser parser)
        {
            var parametersList = new List <SqlCodeExpr>();

            parser.Scanner.Consume(SqlToken.LParen);

            var dataType = parser.ConsumeDataType();

            parametersList.Add(dataType);

            parser.Scanner.Consume(SqlToken.Comma);

            var expr = parser.ParseExpIgnoreComment();

            parametersList.Add(expr);

            if (parser.Scanner.Match(SqlToken.Comma))
            {
                var styleSpan = parser.Scanner.Consume();
                var style     = parser.PrefixParse(styleSpan) as SqlCodeExpr;
                parametersList.Add(style);
            }

            parser.Scanner.Consume(SqlToken.RParen);
            var funcName = new ObjectIdSqlCodeExpr
            {
                ObjectName = "CONVERT"
            };

            return(new FuncSqlCodeExpr
            {
                Name = funcName,
                Parameters = parametersList
            });
        }
Example #2
0
        public IExpression Parse(TextSpan token, IParser parser)
        {
            var funcName = parser.Scanner.GetSpanString(token);

            parser.Scanner.Consume(SqlToken.LParen);
            var arguments = new List <SqlCodeExpr>();

            do
            {
                if (arguments.Count >= _maxParameterCount)
                {
                    ThrowHelper.ThrowParseException(parser, $"Expect Max Parameter Count={_maxParameterCount} for '{funcName}' Function.");
                }
                var innerExpr = parser.ParseExpIgnoreComment();
                arguments.Add(innerExpr);
            } while (parser.Scanner.Match(SqlToken.Comma));
            parser.Scanner.ConsumeAny(SqlToken.RParen);

            var funcNameExpr = new ObjectIdSqlCodeExpr
            {
                ObjectName = funcName
            };

            return(new FuncSqlCodeExpr
            {
                Name = funcNameExpr,
                Parameters = arguments
            });
        }
Example #3
0
        private IExpression AlterDatabase(TextSpan databaseSpan, IParser parser)
        {
            SqlCodeExpr databaseName = null;

            if (parser.MatchToken(SqlToken.CURRENT))
            {
                databaseName = new ObjectIdSqlCodeExpr
                {
                    ObjectName = "CURRENT"
                };
            }
            else
            {
                databaseName = parser.ConsumeObjectId();
            }

            var actionExpr = parser.ConsumeAny(
                ParseSetOnOff,
                ParseAddFileGroup);

            var isSemicolon = parser.MatchToken(SqlToken.Semicolon);

            return(new AlterDatabaseSqlCodeExpr
            {
                DatabaseName = databaseName,
                ActionExpr = actionExpr,
                IsSemicolon = isSemicolon,
            });
        }
Example #4
0
        public IExpression Parse(TextSpan token, IParser parser)
        {
            var funcName = parser.Scanner.GetSpanString(token);

            if (token.Type != TokenType.Identifier.ToString())
            {
                funcName = funcName.ToUpper();
            }
            var funcNameExpr = new ObjectIdSqlCodeExpr
            {
                ObjectName = funcName
            };

            if (!parser.IsToken(SqlToken.LParen))
            {
                token.Type = SqlToken.Identifier.ToString();
                return(parser.PrefixParse(token));
            }

            var parameterList = parser.ParseParameterList($"Function '{funcName}'", _minParameterCount, _maxParameterCount);

            return(new FuncSqlCodeExpr
            {
                Name = funcNameExpr,
                Parameters = parameterList
            });
        }
Example #5
0
        public IExpression Parse(TextSpan token, IParser parser)
        {
            parser.Scanner.Consume(SqlToken.LParen);

            var arguments = new List <SqlCodeExpr>();
            var innerExpr = parser.ParseExp() as SqlCodeExpr;

            arguments.Add(innerExpr);

            var existsNameExpr = new ObjectIdSqlCodeExpr
            {
                DatabaseName = string.Empty,
                SchemaName   = string.Empty,
                ObjectName   = "EXISTS"
            };

            parser.Scanner.ConsumeAny(SqlToken.RParen);
            return(new FuncSqlCodeExpr
            {
                Name = existsNameExpr,
                Parameters = arguments
            });
        }
Example #6
0
        public IExpression Parse(TextSpan token, IParser parser)
        {
            var intoToken = string.Empty;

            if (parser.Scanner.Match(SqlToken.Into))
            {
                intoToken = "INTO";
            }

            var targetTable = parser.ConsumeObjectId();
            var withOptions = parser.ParseWithOption();

            if (!parser.TryConsumeAliasName(out var targetTableAliasName) && parser.Scanner.IsTokenList(SqlToken.As, SqlToken.Target))
            {
                parser.Scanner.Consume(SqlToken.As);
                parser.Scanner.Consume(SqlToken.Target);
                targetTableAliasName = new ObjectIdSqlCodeExpr
                {
                    ObjectName = "Target"
                };
            }

            parser.Scanner.Consume(SqlToken.Using);

            var tableSource = parser.ParseExpIgnoreComment();

            if (!parser.TryConsumeAliasName(out var tableSourceAliasName) && parser.Scanner.IsTokenList(SqlToken.As, SqlToken.Source))
            {
                parser.Scanner.Consume(SqlToken.As);
                parser.Scanner.Consume(SqlToken.Source);
                targetTableAliasName = new ObjectIdSqlCodeExpr
                {
                    ObjectName = "Source"
                };
            }

            var sourceColumnList = new List <SqlCodeExpr>();

            if (parser.MatchToken(SqlToken.LParen))
            {
                sourceColumnList = parser.ParseColumnList();
                parser.ConsumeToken(SqlToken.RParen);
            }

            parser.Scanner.Consume(SqlToken.ON);

            var mergeSearchCondition = parser.ParseExpIgnoreComment();

            var whenList = new List <SqlCodeExpr>();

            do
            {
                SqlCodeExpr whenItem = GetWhenNotMatched(parser);
                if (whenItem == null)
                {
                    whenItem = GetWhenMatched(parser);
                    if (whenItem == null)
                    {
                        break;
                    }
                }
                whenList.Add(whenItem);
            } while (true);

            var outputList = parser.ParseOutputListExpr();

            parser.Scanner.Consume(SqlToken.Semicolon);

            return(new MergeSqlCodeExpr
            {
                IntoToken = intoToken,
                TargetTable = targetTable,
                TargetTableAliasName = targetTableAliasName,
                WithOptions = withOptions,
                TableSource = tableSource,
                SourceColumnList = sourceColumnList,
                TableSourceAliasName = tableSourceAliasName,
                OnMergeSearchCondition = mergeSearchCondition,
                WhenList = whenList,
                OutputList = outputList,
            });
        }