Terraria v1.4.4.9
Terraria source code documentation
Loading...
Searching...
No Matches

◆ EvalBinaryOp()

object System.Data.BinaryNode.EvalBinaryOp ( int op,
ExpressionNode left,
ExpressionNode right,
DataRow row,
DataRowVersion version,
int[] recordNos )
inlineprivateinherited

Definition at line 342 of file BinaryNode.cs.

343 {
344 object obj2;
346 object obj;
347 if (op != 27 && op != 26 && op != 5 && op != 13 && op != 39)
348 {
349 obj = Eval(left, row, version, recordNos);
350 obj2 = Eval(right, row, version, recordNos);
351 Type type = obj.GetType();
352 Type type2 = obj2.GetType();
355 bool flag = DataStorage.IsSqlType(storageType);
357 if (flag && DataStorage.IsObjectSqlNull(obj))
358 {
359 return obj;
360 }
362 {
363 return obj2;
364 }
365 if (obj == DBNull.Value || obj2 == DBNull.Value)
366 {
367 return DBNull.Value;
368 }
369 storageType3 = ((!(flag || flag2)) ? ResultType(storageType, storageType2, left is ConstNode, right is ConstNode, op) : ResultSqlType(storageType, storageType2, left is ConstNode, right is ConstNode, op));
370 if (storageType3 == StorageType.Empty)
371 {
373 }
374 }
375 else
376 {
377 obj = (obj2 = DBNull.Value);
379 }
380 object result = DBNull.Value;
381 bool flag3 = false;
382 try
383 {
384 switch (op)
385 {
386 case 15:
387 switch (storageType3)
388 {
389 case StorageType.Byte:
390 result = Convert.ToByte(Convert.ToByte(obj, base.FormatProvider) + Convert.ToByte(obj2, base.FormatProvider), base.FormatProvider);
391 break;
392 case StorageType.SByte:
393 result = Convert.ToSByte(Convert.ToSByte(obj, base.FormatProvider) + Convert.ToSByte(obj2, base.FormatProvider), base.FormatProvider);
394 break;
395 case StorageType.Int16:
396 result = Convert.ToInt16(Convert.ToInt16(obj, base.FormatProvider) + Convert.ToInt16(obj2, base.FormatProvider), base.FormatProvider);
397 break;
398 case StorageType.UInt16:
399 result = Convert.ToUInt16(Convert.ToUInt16(obj, base.FormatProvider) + Convert.ToUInt16(obj2, base.FormatProvider), base.FormatProvider);
400 break;
401 case StorageType.Int32:
402 result = checked(Convert.ToInt32(obj, base.FormatProvider) + Convert.ToInt32(obj2, base.FormatProvider));
403 break;
404 case StorageType.UInt32:
405 result = checked(Convert.ToUInt32(obj, base.FormatProvider) + Convert.ToUInt32(obj2, base.FormatProvider));
406 break;
407 case StorageType.UInt64:
408 result = checked(Convert.ToUInt64(obj, base.FormatProvider) + Convert.ToUInt64(obj2, base.FormatProvider));
409 break;
410 case StorageType.Int64:
411 result = checked(Convert.ToInt64(obj, base.FormatProvider) + Convert.ToInt64(obj2, base.FormatProvider));
412 break;
413 case StorageType.Decimal:
414 result = Convert.ToDecimal(obj, base.FormatProvider) + Convert.ToDecimal(obj2, base.FormatProvider);
415 break;
416 case StorageType.Single:
417 result = Convert.ToSingle(obj, base.FormatProvider) + Convert.ToSingle(obj2, base.FormatProvider);
418 break;
419 case StorageType.Double:
420 result = Convert.ToDouble(obj, base.FormatProvider) + Convert.ToDouble(obj2, base.FormatProvider);
421 break;
422 case StorageType.Char:
423 case StorageType.String:
424 result = Convert.ToString(obj, base.FormatProvider) + Convert.ToString(obj2, base.FormatProvider);
425 break;
426 case StorageType.DateTime:
427 if (obj is TimeSpan && obj2 is DateTime)
428 {
429 result = (DateTime)obj2 + (TimeSpan)obj;
430 }
431 else if (obj is DateTime && obj2 is TimeSpan)
432 {
433 result = (DateTime)obj + (TimeSpan)obj2;
434 }
435 else
436 {
437 flag3 = true;
438 }
439 break;
440 case StorageType.TimeSpan:
441 result = (TimeSpan)obj + (TimeSpan)obj2;
442 break;
443 case StorageType.SqlInt16:
445 break;
446 case StorageType.SqlInt32:
448 break;
449 case StorageType.SqlInt64:
451 break;
452 case StorageType.SqlDouble:
454 break;
455 case StorageType.SqlSingle:
457 break;
458 case StorageType.SqlDecimal:
460 break;
461 case StorageType.SqlMoney:
463 break;
464 case StorageType.SqlByte:
466 break;
467 case StorageType.SqlString:
469 break;
470 case StorageType.SqlDateTime:
472 {
474 }
475 else if (obj is SqlDateTime && obj2 is TimeSpan)
476 {
478 }
479 else
480 {
481 flag3 = true;
482 }
483 break;
484 default:
485 flag3 = true;
486 break;
487 }
488 break;
489 case 16:
490 switch (storageType3)
491 {
492 case StorageType.Byte:
493 result = Convert.ToByte(Convert.ToByte(obj, base.FormatProvider) - Convert.ToByte(obj2, base.FormatProvider), base.FormatProvider);
494 break;
495 case StorageType.SqlByte:
497 break;
498 case StorageType.SByte:
499 result = Convert.ToSByte(Convert.ToSByte(obj, base.FormatProvider) - Convert.ToSByte(obj2, base.FormatProvider), base.FormatProvider);
500 break;
501 case StorageType.Int16:
502 result = Convert.ToInt16(Convert.ToInt16(obj, base.FormatProvider) - Convert.ToInt16(obj2, base.FormatProvider), base.FormatProvider);
503 break;
504 case StorageType.SqlInt16:
506 break;
507 case StorageType.UInt16:
508 result = Convert.ToUInt16(Convert.ToUInt16(obj, base.FormatProvider) - Convert.ToUInt16(obj2, base.FormatProvider), base.FormatProvider);
509 break;
510 case StorageType.Int32:
511 result = checked(Convert.ToInt32(obj, base.FormatProvider) - Convert.ToInt32(obj2, base.FormatProvider));
512 break;
513 case StorageType.SqlInt32:
515 break;
516 case StorageType.UInt32:
517 result = checked(Convert.ToUInt32(obj, base.FormatProvider) - Convert.ToUInt32(obj2, base.FormatProvider));
518 break;
519 case StorageType.Int64:
520 result = checked(Convert.ToInt64(obj, base.FormatProvider) - Convert.ToInt64(obj2, base.FormatProvider));
521 break;
522 case StorageType.SqlInt64:
524 break;
525 case StorageType.UInt64:
526 result = checked(Convert.ToUInt64(obj, base.FormatProvider) - Convert.ToUInt64(obj2, base.FormatProvider));
527 break;
528 case StorageType.Decimal:
529 result = Convert.ToDecimal(obj, base.FormatProvider) - Convert.ToDecimal(obj2, base.FormatProvider);
530 break;
531 case StorageType.SqlDecimal:
533 break;
534 case StorageType.Single:
535 result = Convert.ToSingle(obj, base.FormatProvider) - Convert.ToSingle(obj2, base.FormatProvider);
536 break;
537 case StorageType.SqlSingle:
539 break;
540 case StorageType.Double:
541 result = Convert.ToDouble(obj, base.FormatProvider) - Convert.ToDouble(obj2, base.FormatProvider);
542 break;
543 case StorageType.SqlDouble:
545 break;
546 case StorageType.SqlMoney:
548 break;
549 case StorageType.DateTime:
550 result = (DateTime)obj - (TimeSpan)obj2;
551 break;
552 case StorageType.TimeSpan:
553 result = ((!(obj is DateTime)) ? ((object)((TimeSpan)obj - (TimeSpan)obj2)) : ((object)((DateTime)obj - (DateTime)obj2)));
554 break;
555 case StorageType.SqlDateTime:
557 {
559 }
560 else if (obj is SqlDateTime && obj2 is TimeSpan)
561 {
563 }
564 else
565 {
566 flag3 = true;
567 }
568 break;
569 default:
570 flag3 = true;
571 break;
572 }
573 break;
574 case 17:
575 switch (storageType3)
576 {
577 case StorageType.Byte:
578 result = Convert.ToByte(Convert.ToByte(obj, base.FormatProvider) * Convert.ToByte(obj2, base.FormatProvider), base.FormatProvider);
579 break;
580 case StorageType.SqlByte:
582 break;
583 case StorageType.SByte:
584 result = Convert.ToSByte(Convert.ToSByte(obj, base.FormatProvider) * Convert.ToSByte(obj2, base.FormatProvider), base.FormatProvider);
585 break;
586 case StorageType.Int16:
587 result = Convert.ToInt16(Convert.ToInt16(obj, base.FormatProvider) * Convert.ToInt16(obj2, base.FormatProvider), base.FormatProvider);
588 break;
589 case StorageType.SqlInt16:
591 break;
592 case StorageType.UInt16:
593 result = Convert.ToUInt16(Convert.ToUInt16(obj, base.FormatProvider) * Convert.ToUInt16(obj2, base.FormatProvider), base.FormatProvider);
594 break;
595 case StorageType.Int32:
596 result = checked(Convert.ToInt32(obj, base.FormatProvider) * Convert.ToInt32(obj2, base.FormatProvider));
597 break;
598 case StorageType.SqlInt32:
600 break;
601 case StorageType.UInt32:
602 result = checked(Convert.ToUInt32(obj, base.FormatProvider) * Convert.ToUInt32(obj2, base.FormatProvider));
603 break;
604 case StorageType.Int64:
605 result = checked(Convert.ToInt64(obj, base.FormatProvider) * Convert.ToInt64(obj2, base.FormatProvider));
606 break;
607 case StorageType.SqlInt64:
609 break;
610 case StorageType.UInt64:
611 result = checked(Convert.ToUInt64(obj, base.FormatProvider) * Convert.ToUInt64(obj2, base.FormatProvider));
612 break;
613 case StorageType.Decimal:
614 result = Convert.ToDecimal(obj, base.FormatProvider) * Convert.ToDecimal(obj2, base.FormatProvider);
615 break;
616 case StorageType.SqlDecimal:
618 break;
619 case StorageType.Single:
620 result = Convert.ToSingle(obj, base.FormatProvider) * Convert.ToSingle(obj2, base.FormatProvider);
621 break;
622 case StorageType.SqlSingle:
624 break;
625 case StorageType.SqlMoney:
627 break;
628 case StorageType.Double:
629 result = Convert.ToDouble(obj, base.FormatProvider) * Convert.ToDouble(obj2, base.FormatProvider);
630 break;
631 case StorageType.SqlDouble:
633 break;
634 default:
635 flag3 = true;
636 break;
637 }
638 break;
639 case 18:
640 switch (storageType3)
641 {
642 case StorageType.Byte:
643 result = Convert.ToByte(Convert.ToByte(obj, base.FormatProvider) / Convert.ToByte(obj2, base.FormatProvider), base.FormatProvider);
644 break;
645 case StorageType.SqlByte:
647 break;
648 case StorageType.SByte:
649 result = Convert.ToSByte(Convert.ToSByte(obj, base.FormatProvider) / Convert.ToSByte(obj2, base.FormatProvider), base.FormatProvider);
650 break;
651 case StorageType.Int16:
652 result = Convert.ToInt16(Convert.ToInt16(obj, base.FormatProvider) / Convert.ToInt16(obj2, base.FormatProvider), base.FormatProvider);
653 break;
654 case StorageType.SqlInt16:
656 break;
657 case StorageType.UInt16:
658 result = Convert.ToUInt16(Convert.ToUInt16(obj, base.FormatProvider) / Convert.ToUInt16(obj2, base.FormatProvider), base.FormatProvider);
659 break;
660 case StorageType.Int32:
661 result = Convert.ToInt32(obj, base.FormatProvider) / Convert.ToInt32(obj2, base.FormatProvider);
662 break;
663 case StorageType.SqlInt32:
665 break;
666 case StorageType.UInt32:
667 result = Convert.ToUInt32(obj, base.FormatProvider) / Convert.ToUInt32(obj2, base.FormatProvider);
668 break;
669 case StorageType.UInt64:
670 result = Convert.ToUInt64(obj, base.FormatProvider) / Convert.ToUInt64(obj2, base.FormatProvider);
671 break;
672 case StorageType.Int64:
673 result = Convert.ToInt64(obj, base.FormatProvider) / Convert.ToInt64(obj2, base.FormatProvider);
674 break;
675 case StorageType.SqlInt64:
677 break;
678 case StorageType.Decimal:
679 result = Convert.ToDecimal(obj, base.FormatProvider) / Convert.ToDecimal(obj2, base.FormatProvider);
680 break;
681 case StorageType.SqlDecimal:
683 break;
684 case StorageType.Single:
685 result = Convert.ToSingle(obj, base.FormatProvider) / Convert.ToSingle(obj2, base.FormatProvider);
686 break;
687 case StorageType.SqlSingle:
689 break;
690 case StorageType.SqlMoney:
692 break;
693 case StorageType.Double:
694 {
695 double num = Convert.ToDouble(obj2, base.FormatProvider);
696 result = Convert.ToDouble(obj, base.FormatProvider) / num;
697 break;
698 }
699 case StorageType.SqlDouble:
701 break;
702 default:
703 flag3 = true;
704 break;
705 }
706 break;
707 case 7:
708 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2)))
709 {
710 return DBNull.Value;
711 }
712 return BinaryCompare(obj, obj2, storageType3, 7) == 0;
713 case 8:
714 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2)))
715 {
716 return DBNull.Value;
717 }
718 return 0 < BinaryCompare(obj, obj2, storageType3, op);
719 case 9:
720 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2)))
721 {
722 return DBNull.Value;
723 }
724 return 0 > BinaryCompare(obj, obj2, storageType3, op);
725 case 10:
726 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2)))
727 {
728 return DBNull.Value;
729 }
730 return 0 <= BinaryCompare(obj, obj2, storageType3, op);
731 case 11:
732 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2)))
733 {
734 return DBNull.Value;
735 }
736 return 0 >= BinaryCompare(obj, obj2, storageType3, op);
737 case 12:
738 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)) || obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2)))
739 {
740 return DBNull.Value;
741 }
742 return BinaryCompare(obj, obj2, storageType3, op) != 0;
743 case 13:
744 obj = Eval(left, row, version, recordNos);
745 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)))
746 {
747 return true;
748 }
749 return false;
750 case 39:
751 obj = Eval(left, row, version, recordNos);
752 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)))
753 {
754 return false;
755 }
756 return true;
757 case 26:
758 obj = Eval(left, row, version, recordNos);
759 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)))
760 {
761 return DBNull.Value;
762 }
763 if (!(obj is bool) && !(obj is SqlBoolean))
764 {
765 obj2 = Eval(right, row, version, recordNos);
766 flag3 = true;
767 break;
768 }
769 if (obj is bool)
770 {
771 if (!(bool)obj)
772 {
773 result = false;
774 break;
775 }
776 }
777 else if (((SqlBoolean)obj).IsFalse)
778 {
779 result = false;
780 break;
781 }
782 obj2 = Eval(right, row, version, recordNos);
783 if (obj2 == DBNull.Value || (right.IsSqlColumn && DataStorage.IsObjectSqlNull(obj2)))
784 {
785 return DBNull.Value;
786 }
787 if (obj2 is bool || obj2 is SqlBoolean)
788 {
789 result = ((!(obj2 is bool)) ? ((object)((SqlBoolean)obj2).IsTrue) : ((object)(bool)obj2));
790 }
791 else
792 {
793 flag3 = true;
794 }
795 break;
796 case 27:
797 obj = Eval(left, row, version, recordNos);
798 if (obj != DBNull.Value && !DataStorage.IsObjectSqlNull(obj))
799 {
800 if (!(obj is bool) && !(obj is SqlBoolean))
801 {
802 obj2 = Eval(right, row, version, recordNos);
803 flag3 = true;
804 break;
805 }
806 if ((bool)obj)
807 {
808 result = true;
809 break;
810 }
811 }
812 obj2 = Eval(right, row, version, recordNos);
813 if (obj2 == DBNull.Value || DataStorage.IsObjectSqlNull(obj2))
814 {
815 return obj;
816 }
817 if (obj == DBNull.Value || DataStorage.IsObjectSqlNull(obj))
818 {
819 return obj2;
820 }
821 if (!(obj2 is bool) && !(obj2 is SqlBoolean))
822 {
823 flag3 = true;
824 }
825 else
826 {
827 result = ((obj2 is bool) ? ((bool)obj2) : ((SqlBoolean)obj2).IsTrue);
828 }
829 break;
830 case 20:
831 if (ExpressionNode.IsIntegerSql(storageType3))
832 {
833 if (storageType3 == StorageType.UInt64)
834 {
835 result = Convert.ToUInt64(obj, base.FormatProvider) % Convert.ToUInt64(obj2, base.FormatProvider);
836 }
838 {
840 result = storageType3 switch
841 {
842 StorageType.SqlInt32 => sqlInt.ToSqlInt32(),
843 StorageType.SqlInt16 => sqlInt.ToSqlInt16(),
844 StorageType.SqlByte => sqlInt.ToSqlByte(),
845 _ => sqlInt,
846 };
847 }
848 else
849 {
850 result = Convert.ToInt64(obj, base.FormatProvider) % Convert.ToInt64(obj2, base.FormatProvider);
851 result = Convert.ChangeType(result, DataStorage.GetTypeStorage(storageType3), base.FormatProvider);
852 }
853 }
854 else
855 {
856 flag3 = true;
857 }
858 break;
859 case 5:
860 {
861 if (!(right is FunctionNode))
862 {
863 throw ExprException.InWithoutParentheses();
864 }
865 obj = Eval(left, row, version, recordNos);
866 if (obj == DBNull.Value || (left.IsSqlColumn && DataStorage.IsObjectSqlNull(obj)))
867 {
868 return DBNull.Value;
869 }
870 result = false;
871 FunctionNode functionNode = (FunctionNode)right;
872 for (int i = 0; i < functionNode._argumentCount; i++)
873 {
874 obj2 = functionNode._arguments[i].Eval();
875 if (obj2 != DBNull.Value && (!right.IsSqlColumn || !DataStorage.IsObjectSqlNull(obj2)))
876 {
878 if (BinaryCompare(obj, obj2, storageType3, 7) == 0)
879 {
880 result = true;
881 break;
882 }
883 }
884 }
885 break;
886 }
887 default:
888 throw ExprException.UnsupportedOperator(op);
889 }
890 }
891 catch (OverflowException)
892 {
893 throw ExprException.Overflow(DataStorage.GetTypeStorage(storageType3));
894 }
895 if (flag3)
896 {
897 SetTypeMismatchError(op, obj.GetType(), obj2.GetType());
898 }
899 return result;
900 }
StorageType ResultSqlType(StorageType left, StorageType right, bool lc, bool rc, int op)
StorageType ResultType(StorageType left, StorageType right, bool lc, bool rc, int op)
int BinaryCompare(object vLeft, object vRight, StorageType resultType, int op)
override object Eval()
Definition BinaryNode.cs:71
void SetTypeMismatchError(int op, Type left, Type right)
static Type GetTypeStorage(StorageType storageType)
static bool IsObjectSqlNull(object value)
static bool IsSqlType(StorageType storageType)
static StorageType GetStorageType(Type dataType)
static SqlDouble ConvertToSqlDouble(object value)
Definition SqlConvert.cs:85
static SqlDecimal ConvertToSqlDecimal(object value)
static SqlString ConvertToSqlString(object value)
static SqlMoney ConvertToSqlMoney(object value)
static SqlInt32 ConvertToSqlInt32(object value)
Definition SqlConvert.cs:42
static SqlByte ConvertToSqlByte(object value)
Definition SqlConvert.cs:10
static SqlInt16 ConvertToSqlInt16(object value)
Definition SqlConvert.cs:25
static SqlDateTime ConvertToSqlDateTime(object value)
static SqlInt64 ConvertToSqlInt64(object value)
Definition SqlConvert.cs:62
static SqlSingle ConvertToSqlSingle(object value)
ExpressionNode(DataTable table)

References System.Data.BinaryNode.BinaryCompare(), System.Convert.ChangeType(), System.Data.Common.SqlConvert.ConvertToSqlByte(), System.Data.Common.SqlConvert.ConvertToSqlDateTime(), System.Data.Common.SqlConvert.ConvertToSqlDecimal(), System.Data.Common.SqlConvert.ConvertToSqlDouble(), System.Data.Common.SqlConvert.ConvertToSqlInt16(), System.Data.Common.SqlConvert.ConvertToSqlInt32(), System.Data.Common.SqlConvert.ConvertToSqlInt64(), System.Data.Common.SqlConvert.ConvertToSqlMoney(), System.Data.Common.SqlConvert.ConvertToSqlSingle(), System.Data.Common.SqlConvert.ConvertToSqlString(), System.Data.BinaryNode.DateTime, System.Data.BinaryNode.Eval(), System.Data.Common.DataStorage.GetStorageType(), System.Type.GetType(), System.Data.Common.DataStorage.GetTypeStorage(), System.Data.ExprException.InWithoutParentheses(), System.Data.ExpressionNode.IsIntegerSql(), System.Data.Common.DataStorage.IsObjectSqlNull(), System.Data.ExpressionNode.IsSqlColumn, System.Data.Common.DataStorage.IsSqlType(), System.obj, System.Data.ExprException.Overflow(), System.Data.BinaryNode.ResultSqlType(), System.Data.BinaryNode.ResultType(), System.Data.BinaryNode.SetTypeMismatchError(), System.Data.BinaryNode.SqlBoolean, System.Data.BinaryNode.TimeSpan, System.Convert.ToByte(), System.Convert.ToDecimal(), System.Convert.ToDouble(), System.Convert.ToInt16(), System.Convert.ToInt32(), System.Convert.ToInt64(), System.Convert.ToSByte(), System.Convert.ToSingle(), System.Convert.ToString(), System.Convert.ToUInt16(), System.Convert.ToUInt32(), System.Convert.ToUInt64(), System.type, System.Data.ExprException.UnsupportedOperator(), and System.DBNull.Value.

Referenced by System.Data.BinaryNode.Eval(), and System.Data.BinaryNode.Eval().