diff --git a/pykusto/expressions.py b/pykusto/expressions.py
index 70e8207..2dc2e4f 100644
--- a/pykusto/expressions.py
+++ b/pykusto/expressions.py
@@ -188,12 +188,24 @@ class BooleanExpression(BaseExpression):
         """
         return BooleanExpression.binary_op(self, ' and ', other)
 
+    def __rand__(self, other: BooleanType) -> 'BooleanExpression':
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/logicaloperators
+        """
+        return BooleanExpression.binary_op(other, ' and ', self)
+
     def __or__(self, other: BooleanType) -> 'BooleanExpression':
         """
         https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/logicaloperators
         """
         return BooleanExpression.binary_op(self, ' or ', other)
 
+    def __ror__(self, other: BooleanType) -> 'BooleanExpression':
+        """
+        https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/logicaloperators
+        """
+        return BooleanExpression.binary_op(other, ' or ', self)
+
     def __invert__(self) -> 'BooleanExpression':
         """
         https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/notfunction
@@ -223,18 +235,33 @@ class NumberExpression(BaseExpression):
     def __add__(self, other: NumberType) -> 'NumberExpression':
         return NumberExpression.binary_op(self, ' + ', other)
 
+    def __radd__(self, other: NumberType) -> 'NumberExpression':
+        return NumberExpression.binary_op(other, ' + ', self)
+
     def __sub__(self, other: NumberType) -> 'NumberExpression':
         return NumberExpression.binary_op(self, ' - ', other)
 
+    def __rsub__(self, other: NumberType) -> 'NumberExpression':
+        return NumberExpression.binary_op(other, ' - ', self)
+
     def __mul__(self, other: NumberType) -> 'NumberExpression':
         return NumberExpression.binary_op(self, ' * ', other)
 
+    def __rmul__(self, other: NumberType) -> 'NumberExpression':
+        return NumberExpression.binary_op(other, ' * ', self)
+
     def __truediv__(self, other: NumberType) -> 'NumberExpression':
         return NumberExpression.binary_op(self, ' / ', other)
 
+    def __rtruediv__(self, other: NumberType) -> 'NumberExpression':
+        return NumberExpression.binary_op(other, ' / ', self)
+
     def __mod__(self, other: NumberType) -> 'NumberExpression':
         return NumberExpression.binary_op(self, ' % ', other)
 
+    def __rmod__(self, other: NumberType) -> 'NumberExpression':
+        return NumberExpression.binary_op(other, ' % ', self)
+
     def __neg__(self) -> 'NumberExpression':
         return NumberExpression(KQL(f'-{self.kql}'))
 
@@ -451,9 +478,12 @@ class DatetimeExpression(BaseExpression):
         return BooleanExpression.binary_op(self, ' >= ', other)
 
     def __add__(self, other: TimespanType) -> 'DatetimeExpression':
+        # https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/datetime-timespan-arithmetic
         return DatetimeExpression.binary_op(self, ' + ', other)
 
     def __sub__(self, other: Union[DatetimeType, TimespanType]) -> Union['DatetimeExpression', 'TimespanExpression']:
+        # https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/datetime-timespan-arithmetic
+
         # noinspection PyTypeChecker
         base_types = get_base_types(other)
         possible_types = base_types & {KustoType.DATETIME, KustoType.TIMESPAN}
@@ -464,6 +494,10 @@ class DatetimeExpression(BaseExpression):
             return_type = TimespanExpression if next(iter(possible_types)) == KustoType.DATETIME else DatetimeExpression
         return return_type(DatetimeExpression.binary_op(self, ' - ', other))
 
+    def __rsub__(self, other: DatetimeType) -> 'TimespanExpression':
+        # https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/datetime-timespan-arithmetic
+        return TimespanExpression.binary_op(other, ' - ', self)
+
     def between(self, lower: DatetimeType, upper: DatetimeType) -> BooleanExpression:
         """
         https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/betweenoperator
@@ -591,11 +625,21 @@ class TimespanExpression(BaseExpression):
         return BaseExpression.base_binary_op(left, operator, right, KustoType.TIMESPAN)
 
     def __add__(self, other: TimespanType) -> 'TimespanExpression':
+        # https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/datetime-timespan-arithmetic
         return TimespanExpression.binary_op(self, ' + ', other)
 
+    def __radd__(self, other: TimespanType) -> 'TimespanExpression':
+        # https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/datetime-timespan-arithmetic
+        return TimespanExpression.binary_op(other, ' + ', self)
+
     def __sub__(self, other: TimespanType) -> 'TimespanExpression':
+        # https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/datetime-timespan-arithmetic
         return TimespanExpression.binary_op(self, ' - ', other)
 
+    def __rsub__(self, other: TimespanType) -> 'TimespanExpression':
+        # https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/datetime-timespan-arithmetic
+        return TimespanExpression.binary_op(other, ' - ', self)
+
     def ago(self) -> DatetimeExpression:
         """
         https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/agofunction
@@ -788,7 +832,9 @@ class BaseColumn(BaseExpression):
         return object.__new__(cls)
 
     def __init__(self, name: str, quote: bool = False) -> None:
-        super().__init__(KQL(f"['{name}']" if quote or '.' in name or name in KUSTO_KEYWORDS else name))
+        assert len(name) > 0, "Column name must not be empty"
+        should_quote = quote or '.' in name or name in KUSTO_KEYWORDS or name.isdigit()
+        super().__init__(KQL(f"['{name}']" if should_quote else name))
         self._name = name
 
     def get_name(self) -> str:
@@ -847,20 +893,40 @@ class TimespanColumn(BaseColumn, TimespanExpression):
 
 
 class SubtractableColumn(NumberColumn, DatetimeColumn, TimespanColumn):
-    def __sub__(self, other: Union['NumberType', 'DatetimeType', 'TimespanType']) -> Union['NumberExpression', 'TimespanExpression', 'AnyExpression']:
+    @staticmethod
+    def __resolve_type(type_to_resolve: Union['NumberType', 'DatetimeType', 'TimespanType']) -> Optional[KustoType]:
         # noinspection PyTypeChecker
-        base_types = get_base_types(other)
+        base_types = get_base_types(type_to_resolve)
         possible_types = base_types & ({KustoType.DATETIME, KustoType.TIMESPAN} | NUMBER_TYPES)
-
         assert len(possible_types) > 0, "Invalid type subtracted"
         if possible_types == NUMBER_TYPES:
-            return_type = KustoType.INT
-        elif len(possible_types) > 1:
-            return_type = None
-        else:
-            return_type = KustoType.TIMESPAN if next(iter(possible_types)) == KustoType.DATETIME else None
+            return KustoType.INT
+        if len(possible_types) > 1:
+            return None
+        return next(iter(possible_types))
+
+    def __sub__(self, other: Union['NumberType', 'DatetimeType', 'TimespanType']) -> Union['NumberExpression', 'TimespanExpression', 'AnyExpression']:
+        resolved_type = self.__resolve_type(other)
+        if resolved_type == KustoType.DATETIME:
+            # Subtracting a datetime can only result in a timespan
+            resolved_type = KustoType.TIMESPAN
+        elif resolved_type == KustoType.TIMESPAN:
+            # Subtracting a timespan can result in either a timespan or a datetime
+            resolved_type = None
+        # Otherwise: subtracting a number can only result in a number
+
+        # noinspection PyTypeChecker
+        return BaseExpression.base_binary_op(self, ' - ', other, resolved_type)
+
+    def __rsub__(self, other: Union['NumberType', 'DatetimeType', 'TimespanType']) -> Union['NumberExpression', 'TimespanExpression', 'AnyExpression']:
+        resolved_type = self.__resolve_type(other)
+        if resolved_type == KustoType.DATETIME:
+            # Subtracting from a datetime can result in either a datetime or a timespan
+            resolved_type = None
+        # Otherwise: subtracting from a number or a timespan can only result in a number or a timespan respectively
+
         # noinspection PyTypeChecker
-        return BaseExpression.base_binary_op(self, ' - ', other, return_type)
+        return BaseExpression.base_binary_op(other, ' - ', self, resolved_type)
 
 
 class AnyTypeColumn(SubtractableColumn, BooleanColumn, DynamicColumn, StringColumn):
diff --git a/pykusto/functions.py b/pykusto/functions.py
index 50f98ea..fdc4fb9 100644
--- a/pykusto/functions.py
+++ b/pykusto/functions.py
@@ -131,6 +131,7 @@ class Functions:
         """
         https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/casefunction
         """
+        assert len(args) > 0, "case must have at least three arguments"
         return AnyExpression(KQL(f"case({to_kql(predicate)}, {to_kql(val)}, {', '.join(to_kql(arg) for arg in args)})"))
 
     @staticmethod

multiplying numbers and columns doesn't always work
examples:
Query().where(f.to_double(100 * t.numberField) > 0.2).render()
returns: TypeError: unsupported operand type(s) for *: 'int' and 'AnyTypeColumn'

Query().where(100 * f.to_double(t.numberField) > 0.2).render()
returns: TypeError: unsupported operand type(s) for *: 'int' and 'NumberExpression'

Query().where(col.of(100) * f.to_double(t.numberField) > 0.2).render()
renders as : "| where (['100'] * (todouble(numberField))) > 0.2" which doesn't compile.

I didn't have any more ideas...
diff --git a/test/test_expressions.py b/test/test_expressions.py
index be7f396..0e47b49 100644
--- a/test/test_expressions.py
+++ b/test/test_expressions.py
@@ -1,6 +1,7 @@
 from datetime import timedelta, datetime
 
 from pykusto.expressions import column_generator as col, AnyTypeColumn
+from pykusto.functions import Functions as f
 from pykusto.query import Query
 from test.test_base import TestBase, test_table as t
 
@@ -78,12 +79,24 @@ class TestExpressions(TestBase):
             Query().where(t.boolField & t.stringField.contains("hello")).render(),
         )
 
+    def test_swapped_and(self):
+        self.assertEqual(
+            ' | where 1 and boolField',
+            Query().where(1 & t.boolField).render(),
+        )
+
     def test_or(self):
         self.assertEqual(
             ' | where boolField or (stringField contains "hello")',
             Query().where(t.boolField | t.stringField.contains("hello")).render(),
         )
 
+    def test_swapped_or(self):
+        self.assertEqual(
+            ' | where 0 or boolField',
+            Query().where(0 | t.boolField).render(),
+        )
+
     def test_not(self):
         self.assertEqual(
             ' | where not(stringField contains "hello")',
@@ -102,12 +115,24 @@ class TestExpressions(TestBase):
             Query().extend(foo=t.numField / 2).render(),
         )
 
+    def test_swapped_div(self):
+        self.assertEqual(
+            ' | extend foo = 2 / numField',
+            Query().extend(foo=2 / t.numField).render(),
+        )
+
     def test_mod(self):
         self.assertEqual(
             ' | extend foo = numField % 2',
             Query().extend(foo=t.numField % 2).render(),
         )
 
+    def test_swapped_mod(self):
+        self.assertEqual(
+            ' | extend foo = 2 % numField',
+            Query().extend(foo=2 % t.numField).render(),
+        )
+
     def test_negation(self):
         self.assertEqual(
             ' | extend foo = -numField',
@@ -192,12 +217,24 @@ class TestExpressions(TestBase):
             Query().extend(foo=t.timespanField + timedelta(hours=1)).render(),
         )
 
+    def test_add_swapped_timespan_to_timespan(self):
+        self.assertEqual(
+            ' | extend foo = time(0.1:0:0.0) + timespanField',
+            Query().extend(foo=timedelta(hours=1) + t.timespanField).render(),
+        )
+
     def test_subtract_timespan_from_timespan(self):
         self.assertEqual(
             ' | extend foo = timespanField - time(0.1:0:0.0)',
             Query().extend(foo=t.timespanField - timedelta(hours=1)).render(),
         )
 
+    def test_swapped_subtract_timespan_from_timespan(self):
+        self.assertEqual(
+            ' | extend foo = time(0.1:0:0.0) - timespanField',
+            Query().extend(foo=timedelta(hours=1) - t.timespanField).render(),
+        )
+
     def test_sub_timespan(self):
         self.assertEqual(
             ' | extend foo = dateField - time(0.1:0:0.0)',
@@ -210,7 +247,25 @@ class TestExpressions(TestBase):
             Query().extend(foo=t.dateField - datetime(2020, 1, 1)).render(),
         )
 
+    def test_sub_from_datetime(self):
+        self.assertEqual(
+            ' | extend foo = datetime(2020-01-01 00:00:00.000000) - dateField',
+            Query().extend(foo=datetime(2020, 1, 1) - t.dateField).render(),
+        )
+
+    def test_sub_from_number(self):
+        self.assertEqual(
+            ' | extend foo = 3 - numField',
+            Query().extend(foo=3 - t.numField).render(),
+        )
+
     def test_sub_date_unknown_type(self):
+        self.assertEqual(
+            ' | extend foo = dateField - (case(boolField, bar, baz))',
+            Query().extend(foo=t.dateField - f.case(t.boolField, col.bar, col.baz)).render(),
+        )
+
+    def test_sub_date_unknown_column(self):
         self.assertEqual(
             ' | extend foo = dateField - bar',
             Query().extend(foo=t.dateField - col.bar).render(),
@@ -359,3 +414,27 @@ class TestExpressions(TestBase):
             ' | where [\'stringField\'] has "test"',
             Query().where(col.of('stringField').has("test")).render()
         )
+
+    def test_multiply_number_column(self):
+        self.assertEqual(
+            ' | where (todouble(100 * numberField)) > 0.2',
+            Query().where(f.to_double(100 * t.numberField) > 0.2).render(),
+        )
+
+    def test_add_number_column(self):
+        self.assertEqual(
+            ' | where (todouble(100 + numberField)) > 0.2',
+            Query().where(f.to_double(100 + t.numberField) > 0.2).render(),
+        )
+
+    def test_multiply_number_expression(self):
+        self.assertEqual(
+            ' | where (100 * (todouble(numberField))) > 0.2',
+            Query().where(100 * f.to_double(t.numberField) > 0.2).render(),
+        )
+
+    def test_column_with_digits(self):
+        self.assertEqual(
+            " | where (['100'] * (todouble(numberField))) > 0.2",
+            Query().where(col['100'] * f.to_double(t.numberField) > 0.2).render(),
+        )

pip install -e .
parse_log_pytest
pytest
pytest
3.6
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
adal==1.2.7
attrs @ file:///opt/conda/conda-bld/attrs_1642510447205/work
azure-core==1.24.2
azure-kusto-data==0.1.0
certifi==2021.5.30
cffi==1.15.1
charset-normalizer==2.0.12
cryptography==40.0.2
idna==3.10
importlib-metadata @ file:///tmp/build/80754af9/importlib-metadata_1631916693255/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
isodate==0.6.1
more-itertools @ file:///tmp/build/80754af9/more-itertools_1637733554872/work
msrest==0.7.1
msrestazure==0.6.4.post1
numpy==1.19.5
oauthlib==3.2.2
packaging @ file:///tmp/build/80754af9/packaging_1637314298585/work
pandas==1.0.4
pluggy @ file:///tmp/build/80754af9/pluggy_1615976315926/work
py @ file:///opt/conda/conda-bld/py_1644396412707/work
pycparser==2.21
PyJWT==2.4.0
-e git+https://github.com/Azure/pykusto.git@39a825859c499d219cb2c55e57bc3d3f71568ff7#egg=pykusto
pyparsing @ file:///tmp/build/80754af9/pyparsing_1635766073266/work
pytest==6.2.4
python-dateutil==2.9.0.post0
pytz==2025.2
requests==2.27.1
requests-oauthlib==2.0.0
six==1.17.0
toml @ file:///tmp/build/80754af9/toml_1616166611790/work
typing_extensions @ file:///opt/conda/conda-bld/typing_extensions_1647553014482/work
urllib3==1.26.20
zipp @ file:///tmp/build/80754af9/zipp_1633618647012/work

name: pykusto
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - attrs=21.4.0=pyhd3eb1b0_0
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2021.5.30=py36h06a4308_0
  - importlib-metadata=4.8.1=py36h06a4308_0
  - importlib_metadata=4.8.1=hd3eb1b0_0
  - iniconfig=1.1.1=pyhd3eb1b0_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - more-itertools=8.12.0=pyhd3eb1b0_0
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - packaging=21.3=pyhd3eb1b0_0
  - pip=21.2.2=py36h06a4308_0
  - pluggy=0.13.1=py36h06a4308_0
  - py=1.11.0=pyhd3eb1b0_0
  - pyparsing=3.0.4=pyhd3eb1b0_0
  - pytest=6.2.4=py36h06a4308_2
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - toml=0.10.2=pyhd3eb1b0_0
  - typing_extensions=4.1.1=pyh06a4308_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zipp=3.6.0=pyhd3eb1b0_0
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - adal==1.2.7
      - azure-core==1.24.2
      - azure-kusto-data==0.1.0
      - cffi==1.15.1
      - charset-normalizer==2.0.12
      - cryptography==40.0.2
      - idna==3.10
      - isodate==0.6.1
      - msrest==0.7.1
      - msrestazure==0.6.4.post1
      - numpy==1.19.5
      - oauthlib==3.2.2
      - pandas==1.0.4
      - pycparser==2.21
      - pyjwt==2.4.0
      - python-dateutil==2.9.0.post0
      - pytz==2025.2
      - requests==2.27.1
      - requests-oauthlib==2.0.0
      - six==1.17.0
      - urllib3==1.26.20
prefix: /opt/conda/envs/pykusto

test/test_expressions.py::TestExpressions::test_add_number_column test/test_expressions.py::TestExpressions::test_add_swapped_timespan_to_timespan test/test_expressions.py::TestExpressions::test_column_with_digits test/test_expressions.py::TestExpressions::test_multiply_number_column test/test_expressions.py::TestExpressions::test_multiply_number_expression test/test_expressions.py::TestExpressions::test_sub_from_datetime test/test_expressions.py::TestExpressions::test_sub_from_number test/test_expressions.py::TestExpressions::test_swapped_and test/test_expressions.py::TestExpressions::test_swapped_div test/test_expressions.py::TestExpressions::test_swapped_mod test/test_expressions.py::TestExpressions::test_swapped_or test/test_expressions.py::TestExpressions::test_swapped_subtract_timespan_from_timespan
test/test_expressions.py::TestExpressions::test_abs test/test_expressions.py::TestExpressions::test_add_timespan_to_date test/test_expressions.py::TestExpressions::test_add_timespan_to_timespan test/test_expressions.py::TestExpressions::test_and test/test_expressions.py::TestExpressions::test_array_access test/test_expressions.py::TestExpressions::test_array_access_expression_index test/test_expressions.py::TestExpressions::test_array_access_yields_any_expression test/test_expressions.py::TestExpressions::test_array_contains test/test_expressions.py::TestExpressions::test_assign_to test/test_expressions.py::TestExpressions::test_between test/test_expressions.py::TestExpressions::test_between_date test/test_expressions.py::TestExpressions::test_between_timespan test/test_expressions.py::TestExpressions::test_bin_auto test/test_expressions.py::TestExpressions::test_column_generator test/test_expressions.py::TestExpressions::test_column_name_quoting test/test_expressions.py::TestExpressions::test_column_with_dot test/test_expressions.py::TestExpressions::test_contains test/test_expressions.py::TestExpressions::test_div test/test_expressions.py::TestExpressions::test_dynamic test/test_expressions.py::TestExpressions::test_extend_const test/test_expressions.py::TestExpressions::test_ge test/test_expressions.py::TestExpressions::test_ge_date test/test_expressions.py::TestExpressions::test_gt_date test/test_expressions.py::TestExpressions::test_has test/test_expressions.py::TestExpressions::test_is_empty test/test_expressions.py::TestExpressions::test_is_in test/test_expressions.py::TestExpressions::test_le_date test/test_expressions.py::TestExpressions::test_lt_date test/test_expressions.py::TestExpressions::test_mapping_access test/test_expressions.py::TestExpressions::test_mapping_access_attribute test/test_expressions.py::TestExpressions::test_mapping_access_expression_index test/test_expressions.py::TestExpressions::test_mapping_access_yields_any_expression test/test_expressions.py::TestExpressions::test_mod test/test_expressions.py::TestExpressions::test_negation test/test_expressions.py::TestExpressions::test_not test/test_expressions.py::TestExpressions::test_not_contains test/test_expressions.py::TestExpressions::test_not_equals test/test_expressions.py::TestExpressions::test_or test/test_expressions.py::TestExpressions::test_repr test/test_expressions.py::TestExpressions::test_str_ends_with test/test_expressions.py::TestExpressions::test_str_equals test/test_expressions.py::TestExpressions::test_str_matches test/test_expressions.py::TestExpressions::test_str_not_equals test/test_expressions.py::TestExpressions::test_str_starts_with test/test_expressions.py::TestExpressions::test_sub_date_unknown_column test/test_expressions.py::TestExpressions::test_sub_date_unknown_type test/test_expressions.py::TestExpressions::test_sub_datetime test/test_expressions.py::TestExpressions::test_sub_timespan test/test_expressions.py::TestExpressions::test_sub_unknown_type_datetime test/test_expressions.py::TestExpressions::test_sub_unknown_type_number test/test_expressions.py::TestExpressions::test_sub_unknown_type_timespan test/test_expressions.py::TestExpressions::test_subtract_timespan_from_timespan test/test_expressions.py::TestExpressions::test_to_bool test/test_expressions.py::TestExpressions::test_to_int test/test_expressions.py::TestExpressions::test_to_long
pykusto/functions.py pykusto/expressions.py
pykusto/functions.py pykusto/expressions.py