public TRes VisitExprColumn(ExprColumn exprColumn, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     if (exprColumn is TableColumn tc)
     {
         return(tc.SqlType.Accept(this, ctx));
     }
     return(ctx.ValueVisitor.VisitAny(ctx.Ctx, null));
 }
        public TRes VisitExprDecimalLiteral(ExprDecimalLiteral decimalLiteral, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
        {
            DecimalPrecisionScale?precisionScale = null;

            if (decimalLiteral.Value.HasValue)
            {
                SqlDecimal sd = decimalLiteral.Value.Value;
                precisionScale = new DecimalPrecisionScale(sd.Precision, sd.Scale);
            }

            return(ctx.ValueVisitor.VisitDecimal(ctx.Ctx, !decimalLiteral.Value.HasValue, precisionScale));
        }
 public TRes VisitExprMul(ExprMul exprMul, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprMul.Left.Accept(this, ctx));
 }
 public TRes VisitExprByteArrayLiteral(ExprByteArrayLiteral byteArrayLiteral, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitByteArray(ctx.Ctx, byteArrayLiteral.Value == null, byteArrayLiteral.Value?.Count, false));
 }
 public TRes VisitExprByteLiteral(ExprByteLiteral byteLiteral, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitByte(ctx.Ctx, !byteLiteral.Value.HasValue));
 }
 public TRes VisitExprGuidLiteral(ExprGuidLiteral exprGuidLiteral, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitGuid(ctx.Ctx, !exprGuidLiteral.Value.HasValue));
 }
 TRes IExprTypeVisitor <TRes, ExprValueTypeAnalyzerCtx <TRes, TCtx> > .VisitExprTypeFixSizeString(ExprTypeFixSizeString exprTypeFixSizeString, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitString(ctx.Ctx, null, exprTypeFixSizeString.Size, true));
 }
 TRes IExprTypeVisitor <TRes, ExprValueTypeAnalyzerCtx <TRes, TCtx> > .VisitExprTypeDateTime(ExprTypeDateTime exprTypeDateTime, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitDateTime(ctx.Ctx, null));
 }
 public TRes VisitExprFuncIsNull(ExprFuncIsNull exprFuncIsNull, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprFuncIsNull.Test.Accept(this, ctx));
 }
 public TRes VisitExprCaseWhenThen(ExprCaseWhenThen exprCaseWhenThen, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprCaseWhenThen.Value.Accept(this, ctx));
 }
 public TRes VisitExprCase(ExprCase exprCase, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprCase.DefaultValue.Accept(this, ctx));
 }
 public TRes VisitExprScalarFunction(ExprScalarFunction exprScalarFunction, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitAny(ctx.Ctx, null));
 }
 public TRes VisitExprStringConcat(ExprStringConcat exprStringConcat, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitString(ctx.Ctx, null, null, false));
 }
 public TRes VisitExprModulo(ExprModulo exprModulo, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprModulo.Left.Accept(this, ctx));
 }
 public TRes VisitExprDiv(ExprDiv exprDiv, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprDiv.Left.Accept(this, ctx));
 }
 TRes IExprTypeVisitor <TRes, ExprValueTypeAnalyzerCtx <TRes, TCtx> > .VisitExprTypeInt64(ExprTypeInt64 exprTypeInt64, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitInt64(ctx.Ctx, null));
 }
 TRes IExprTypeVisitor <TRes, ExprValueTypeAnalyzerCtx <TRes, TCtx> > .VisitExprTypeDecimal(ExprTypeDecimal exprTypeDecimal, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitDecimal(ctx.Ctx, null, exprTypeDecimal.PrecisionScale));
 }
 public TRes VisitExprFuncCoalesce(ExprFuncCoalesce exprFuncCoalesce, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprFuncCoalesce.Test.Accept(this, ctx));
 }
 TRes IExprTypeVisitor <TRes, ExprValueTypeAnalyzerCtx <TRes, TCtx> > .VisitExprTypeGuid(ExprTypeGuid exprTypeGuid, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitGuid(ctx.Ctx, null));
 }
 public TRes VisitExprGetUtcDate(ExprGetUtcDate exprGetUtcDate, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitDateTime(ctx.Ctx, false));
 }
 TRes IExprTypeVisitor <TRes, ExprValueTypeAnalyzerCtx <TRes, TCtx> > .VisitExprTypeXml(ExprTypeXml exprTypeXml, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitXml(ctx.Ctx, null));
 }
 public TRes VisitExprDateAdd(ExprDateAdd exprDateAdd, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitDateTime(ctx.Ctx, null));
 }
 public TRes VisitExprStringLiteral(ExprStringLiteral stringLiteral, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitString(ctx.Ctx, stringLiteral.Value == null, stringLiteral.Value?.Length, false));
 }
 public TRes VisitExprCast(ExprCast exprCast, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprCast.SqlType.Accept(this, ctx));
 }
 public TRes VisitExprInt16Literal(ExprInt16Literal int16Literal, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitInt16(ctx.Ctx, !int16Literal.Value.HasValue));
 }
        //Implementation to analyze in "VisitExprCast" and "VisitExprColumn"

        TRes IExprTypeVisitor <TRes, ExprValueTypeAnalyzerCtx <TRes, TCtx> > .VisitExprTypeBoolean(ExprTypeBoolean exprTypeBoolean, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
        {
            return(ctx.ValueVisitor.VisitBool(ctx.Ctx, null));
        }
 public TRes VisitExprDoubleLiteral(ExprDoubleLiteral doubleLiteral, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitDouble(ctx.Ctx, !doubleLiteral.Value.HasValue));
 }
 TRes IExprTypeVisitor <TRes, ExprValueTypeAnalyzerCtx <TRes, TCtx> > .VisitExprTypeFixSizeByteArray(ExprTypeFixSizeByteArray exprTypeFixSizeByteArray, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitByteArray(ctx.Ctx, null, exprTypeFixSizeByteArray.Size, true));
 }
 public TRes VisitExprNull(ExprNull exprNull, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(ctx.ValueVisitor.VisitAny(ctx.Ctx, true));
 }
 public TRes VisitExprSub(ExprSub exprSub, ExprValueTypeAnalyzerCtx <TRes, TCtx> ctx)
 {
     return(exprSub.Left.Accept(this, ctx));
 }