/
krasninja
/
querycat
Обзор
Документация
Войти
/
krasninja
/
querycat
Код
Пакеты
0
Релизы
0
Аналитика
Безопасность
develop
src/QueryCat.Backend/Commands/Declare/DeclareCommand.cs
37 строк
1 KB
Ivan Kozhin
Decouple Commands module from Execution module
17 янв 2024, 14:35
17 янв 2024, 14:35
7f59e20
Код
Авторство
О чём код?
using QueryCat.Backend.Ast.Nodes; using QueryCat.Backend.Ast.Nodes.Declare; using QueryCat.Backend.Commands.Select; using QueryCat.Backend.Core.Execution; using QueryCat.Backend.Core.Types; using QueryCat.Backend.Relational; namespace QueryCat.Backend.Commands.Declare; internal sealed class DeclareCommand : ICommand { /// <inheritdoc /> public IFuncUnit CreateHandler(IExecutionThread<ExecutionOptions> executionThread, StatementNode node) { var declareNode = (DeclareNode)node.RootNode; var scope = executionThread.TopScope; IFuncUnit valueHandler = FuncCommandHandler.NullHandler; if (declareNode.ValueNode != null) { valueHandler = new StatementsVisitor(executionThread).RunAndReturn(declareNode.ValueNode); // There is a special case for SELECT command. We prefer assign first value instead of iterator object. if (valueHandler is SelectCommandHandler selectCommandHandler) { valueHandler = new FuncUnitRowsIteratorScalar(selectCommandHandler.SelectCommandContext.CurrentIterator); } } return new FuncCommandHandler(() => { var value = valueHandler.Invoke(); value = value.Cast(declareNode.Type); scope.Variables[declareNode.Name] = value; return VariantValue.Null; }); } }