示例#1
0
    def test_limit_with_offset(self):
        table = self.create_table()

        query = session.query(table.c.x).limit(10).offset(5)
        self.assertEqual(self.compile(query, literal_binds=True),
                         'SELECT x AS t1_x FROM t1  LIMIT 5, 10')

        query = session.query(table.c.x).offset(5).limit(10)
        self.assertEqual(self.compile(query, literal_binds=True),
                         'SELECT x AS t1_x FROM t1  LIMIT 5, 10')
    def test_escape_binary_mod(self):
        query = session.query(literal(1) % literal(2))
        self.assertEqual(self.compile(query, literal_binds=True),
                         'SELECT 1 %% 2 AS anon_1')

        table = Table('t', self.metadata(),
                      Column('x', types.Int32, primary_key=True),
                      engines.Memory())

        query = session.query(table.c.x % table.c.x)
        self.assertEqual(self.compile(query, literal_binds=True),
                         'SELECT x %% x AS anon_1 FROM t')
    def test_group_by_query(self):
        table = self.create_table()

        query = session.query(table.c.x).group_by(table.c.x)
        self.assertEqual(self.compile(query),
                         'SELECT x AS t1_x FROM t1 GROUP BY x')

        query = session.query(table.c.x).group_by(table.c.x).with_totals()
        self.assertEqual(self.compile(query),
                         'SELECT x AS t1_x FROM t1 GROUP BY x WITH TOTALS')

        with self.assertRaises(exc.InvalidRequestError) as ex:
            session.query(table.c.x).with_totals()

        self.assertIn('with_totals', str(ex.exception))
    def test_select(self):
        table = self.create_table()

        query = session.query(table.c.x).filter(table.c.x.in_([1, 2]))
        self.assertEqual(
            self.compile(query),
            'SELECT x AS t1_x FROM t1 WHERE x IN (%(x_1)s, %(x_2)s)')
示例#5
0
    def test_joins(self):
        t1, t2 = self.create_tables(2)

        query = session.query(t1.c.x, t2.c.x) \
            .join(t2, tuple_(t1.c.x, t1.c.y), any=True)

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "ANY INNER JOIN t1 USING x, y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .join(t2, tuple_(t1.c.x, t1.c.y), all=True)

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "ALL INNER JOIN t1 USING x, y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .join(t2, tuple_(t1.c.x, t1.c.y), all=True, global_=True)

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "GLOBAL ALL INNER JOIN t1 USING x, y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .outerjoin(t2, tuple_(t1.c.x, t1.c.y), all=True, global_=True)

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "GLOBAL ALL LEFT OUTER JOIN t1 USING x, y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .outerjoin(t2, tuple_(t1.c.x, t1.c.y), all=True, global_=True)

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "GLOBAL ALL LEFT OUTER JOIN t1 USING x, y"
        )
    def test_unsupported_expressoin(self):
        t1, t2 = self.create_tables(2)

        query = session.query(t1.c.x).join(t2, literal(True), any=True)
        with self.assertRaises(exc.CompileError) as ex:
            self.compile(query)

        self.assertIn('Only tuple elements are supported', str(ex.exception))
    def test_parse_func_count(self):
        mock.add(mock.POST, self.url, status=200, body='count_1\nUInt64\n42\n')

        table = Table('t1', self.metadata(),
                      Column('x', types.Int32, primary_key=True))

        rv = session.query(func.count()).select_from(table).scalar()
        self.assertEqual(rv, 42)
示例#8
0
    def test_sample(self):
        table = self.create_table()

        query = session.query(table.c.x).sample(0.1).group_by(table.c.x)
        self.assertEqual(
            self.compile(query),
            'SELECT x AS t1_x FROM t1 SAMPLE %(param_1)s GROUP BY x')
        self.assertEqual(self.compile(query, literal_binds=True),
                         'SELECT x AS t1_x FROM t1 SAMPLE 0.1 GROUP BY x')
示例#9
0
    def test_offset_without_limit(self):
        table = self.create_table()

        with self.assertRaises(exc.CompileError) as ex:
            query = session.query(table.c.x).offset(5)
            self.compile(query, literal_binds=True)

        self.assertEqual(str(ex.exception),
                         'OFFSET without LIMIT is not supported')
    def test_parse_nullable_type(self):
        mock.add(mock.POST,
                 self.url,
                 status=200,
                 body=('a\n' + 'String\n' + '\\N\n' + '\\\\N\n' + '\n'))

        table = Table('t1', self.metadata(), Column('a', types.String))

        rv = session.query(*table.c).all()
        self.assertEqual(rv, [(None, ), ('\\N', ), ('', )])
    def test_parse_date_types(self, patched_server_info):
        mock.add(mock.POST,
                 self.url,
                 status=200,
                 body=('a\n' + 'Date\n' + '2012-10-25\n'))

        table = Table('t1', self.metadata(), Column('a', types.Date))

        rv = session.query(*table.c).first()
        self.assertEqual(rv, (date(2012, 10, 25), ))
 def test_lambda_functions(self):
     query = session.query(
         func.arrayFilter(
             Lambda(lambda x: x.like('%World%')),
             literal(['Hello', 'abc World'],
                     types.Array(types.String))).label('test'))
     self.assertEqual(
         self.compile(query, literal_binds=True), "SELECT arrayFilter("
         "x -> x LIKE '%%World%%', ['Hello', 'abc World']"
         ") AS test")
示例#13
0
    def test_parse_date_types(self):
        mock.add(mock.POST,
                 'http://localhost:8123',
                 status=200,
                 body=('a\n' + 'Date\n' + '2012-10-25\n'))

        table = Table('t1', self.metadata(), Column('a', types.Date))

        rv = session.query(*table.c).first()
        self.assertEqual(rv, (date(2012, 10, 25), ))
示例#14
0
    def test_select(self):
        table = self.create_table()

        query = session.query(table.c.x)\
            .filter(table.c.x.in_([1, 2]))\
            .having(func.count() > 0)\
            .order_by(table.c.x.desc())
        self.assertEqual(
            self.compile(query), 'SELECT x AS t1_x '
            'FROM t1 '
            'WHERE x IN (%(x_1)s, %(x_2)s) '
            'HAVING count(*) > %(count_1)s '
            'ORDER BY x DESC')
    def test_insert_from_select_no_format_clause(self):
        metadata = self.metadata()

        bind = session.bind
        bind.cursor = lambda: None

        t1 = Table('t1', metadata, Column('x', types.Int32, primary_key=True))

        t2 = Table('t2', metadata, Column('x', types.Int32, primary_key=True))

        query = t2.insert() \
            .from_select(['x'], session.query(t1.c.x).subquery())
        statement = self.compile(query, bind=bind)
        self.assertEqual(statement, 'INSERT INTO t2 (x) SELECT x FROM t1')
    def test_select_format_clause(self):
        metadata = self.metadata()

        bind = session.bind
        bind.cursor = lambda: None

        table = Table('t1', metadata, Column('x',
                                             types.Int32,
                                             primary_key=True))

        statement = self.compile(session.query(table.c.x), bind=bind)
        self.assertEqual(
            statement,
            'SELECT x AS t1_x FROM t1 FORMAT TabSeparatedWithNamesAndTypes')
    def test_parse_float_types(self):
        types_ = ['Float32', 'Float64']
        columns = ['a', 'b']

        mock.add(mock.POST,
                 self.url,
                 status=200,
                 body=('\t'.join(columns) + '\n' + '\t'.join(types_) + '\n' +
                       '\t'.join(['42'] * len(types_)) + '\n'))

        table = Table('t1', self.metadata(),
                      *[Column(col, types.Float) for col in columns])

        rv = session.query(*table.c).first()
        self.assertEqual(rv, tuple([42.0] * len(columns)))
示例#18
0
 def test_array_join(self):
     table = self.create_table(
         Column('nested.array_column', types.Array(types.Int8)),
         Column('nested.another_array_column', types.Array(types.Int8)))
     first_label = table.c['nested.array_column'].label('from_array')
     second_not_label = table.c['nested.another_array_column']
     query = session.query(first_label, second_not_label)\
         .array_join(first_label, second_not_label)
     self.assertEqual(
         self.compile(query), 'SELECT '
         '"nested.array_column" AS from_array, '
         '"nested.another_array_column" '
         'AS "t1_nested.another_array_column" '
         'FROM t1 '
         'ARRAY JOIN "nested.array_column" AS from_array, '
         '"nested.another_array_column"')
    def test_parse_int_types(self):
        types_ = [
            'Int8', 'UInt8', 'Int16', 'UInt16', 'Int32', 'UInt32', 'Int64',
            'UInt64'
        ]
        columns = [chr(i + ord('a')) for i in range(len(types_))]

        mock.add(mock.POST,
                 self.url,
                 status=200,
                 body=('\t'.join(columns) + '\n' + '\t'.join(types_) + '\n' +
                       '\t'.join(['42'] * len(types_)) + '\n'))

        table = Table('t1', self.metadata(),
                      *[Column(col, types.Int) for col in columns])

        rv = session.query(*table.c).first()
        self.assertEqual(rv, tuple([42] * len(columns)))
示例#20
0
    def test_count_no_column_specified(self):
        table = self.create_table()

        self.assertEqual(
            self.compile(session.query(func.count()).select_from(table)),
            'SELECT count(*) AS count_1 FROM t1')
示例#21
0
    def test_final(self):
        table = self.create_table()

        query = session.query(table.c.x).final().group_by(table.c.x)
        self.assertEqual(self.compile(query),
                         'SELECT x AS t1_x FROM t1 FINAL GROUP BY x')
示例#22
0
 def test_select_escaping(self):
     query = session.query(literal('\t'))
     self.assertEqual(
         self.escaped_compile(query, literal_binds=True),
         "SELECT '\t' AS param_1"
     )
示例#23
0
    def test_count_distinct(self):
        table = self.create_table()

        self.assertEqual(
            self.compile(session.query(func.count(func.distinct(table.c.x)))),
            'SELECT count(distinct(x)) AS count_1 FROM t1')
    def test_joins(self):
        t1, t2 = self.create_tables(2)

        query = session.query(t1.c.x, t2.c.x) \
            .join(
            t2,
            t1.c.x == t1.c.y,
            strictness='any')

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "ANY INNER JOIN t1 ON x = y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .join(
            t2,
            t1.c.x == t1.c.y,
            type='inner',
            strictness='any')

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "ANY INNER JOIN t1 ON x = y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .join(
            t2,
            tuple_(t1.c.x, t1.c.y),
            type='inner',
            strictness='all'
        )

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "ALL INNER JOIN t1 USING x, y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .join(t2,
                  tuple_(t1.c.x, t1.c.y),
                  type='inner',
                  strictness='all',
                  distribution='global')

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "GLOBAL ALL INNER JOIN t1 USING x, y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .outerjoin(
            t2,
            tuple_(t1.c.x, t1.c.y),
            type='left outer',
            strictness='all',
            distribution='global'
        )

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "GLOBAL ALL LEFT OUTER JOIN t1 USING x, y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .outerjoin(
            t2,
            tuple_(t1.c.x, t1.c.y),
            type='LEFT OUTER',
            strictness='ALL',
            distribution='GLOBAL'
        )

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "GLOBAL ALL LEFT OUTER JOIN t1 USING x, y"
        )

        query = session.query(t1.c.x, t2.c.x) \
            .outerjoin(t2,
                       tuple_(t1.c.x, t1.c.y),
                       strictness='ALL',
                       type='FULL OUTER')

        self.assertEqual(
            self.compile(query),
            "SELECT x AS t0_x, x AS t1_x FROM t0 "
            "ALL FULL OUTER JOIN t1 USING x, y"
        )