def testByteaHexCheckFalsePositive(self):
     # the check \x -> x to detect bad bytea decode
     # may be fooled if the first char is really an 'x'
     o1 = psycopg2.Binary(b('x'))
     o2 = self.execute("SELECT %s::bytea AS foo", (o1, ))
     if sys.version_info[:2] < (3, 3):
         self.assertEqual(b('x'), o2[0])
     else:
         self.assertEqual(ord('x'), o2[0])
Beispiel #2
0
 def testByteaHexCheckFalsePositive(self):
     # the check \x -> x to detect bad bytea decode
     # may be fooled if the first char is really an 'x'
     o1 = psycopg2.Binary(b('x'))
     o2 = self.execute("SELECT %s::bytea AS foo", (o1,))
     if sys.version_info[:2] < (3, 3):
         self.assertEqual(b('x'), o2[0])
     else:
         self.assertEqual(ord('x'), o2[0])
 def test_notices_utf8(self):
     conn = self.conn
     cur = conn.cursor()
     if self.conn.server_version >= 90300:
         cur.execute("set client_min_messages=debug1")
     cur.execute(_u(b("create temp table мыыchatty (id serial primary key);")))
     self.assertEqual("CREATE TABLE", cur.statusmessage)
     self.assert_(conn.notices)
     self.assert_(_u(b('мыыchatty')) in conn.notices[0])
Beispiel #4
0
    def _getquoted_9(self):
        """Use the hstore(text[], text[]) function."""
        if not self.wrapped:
            return b("''::hstore")

        k = _ext.adapt(self.wrapped.keys())
        k.prepare(self.conn)
        v = _ext.adapt(self.wrapped.values())
        v.prepare(self.conn)
        return b("hstore(") + k.getquoted() + b(", ") + v.getquoted() + b(")")
Beispiel #5
0
    def _getquoted_9(self):
        """Use the hstore(text[], text[]) function."""
        if not self.wrapped:
            return b("''::hstore")

        k = _ext.adapt(self.wrapped.keys())
        k.prepare(self.conn)
        v = _ext.adapt(self.wrapped.values())
        v.prepare(self.conn)
        return b("hstore(") + k.getquoted() + b(", ") + v.getquoted() + b(")")
Beispiel #6
0
    def test_mogrify_unicode(self):
        conn = self.conn
        cur = conn.cursor()

        # test consistency between execute and mogrify.

        # unicode query containing only ascii data
        cur.execute(_u(b"SELECT 'foo';"))
        self.assertEqual('foo', cur.fetchone()[0])
        self.assertEqual(b"SELECT 'foo';", cur.mogrify(_u(b"SELECT 'foo';")))

        conn.set_client_encoding('UTF8')
        snowman = _u(b'\xe2\x98\x83')

        # unicode query with non-ascii data
        cur.execute(_u(b"SELECT '%s';") % snowman)
        self.assertEqual(snowman.encode('utf8'), b(cur.fetchone()[0]))
        self.assertEqual(("SELECT '%s';" % snowman).encode('utf8'),
            cur.mogrify(_u(b"SELECT '%s';") % snowman).replace(b("E'"), b("'")))

        # unicode args
        cur.execute("SELECT %s;", (snowman,))
        self.assertEqual(snowman.encode("utf-8"), b(cur.fetchone()[0]))
        self.assertEqual(("SELECT '%s';" % snowman).encode('utf8'),
            cur.mogrify("SELECT %s;", (snowman,)).replace(b("E'"), b("'")))

        # unicode query and args
        cur.execute(_u(b"SELECT %s;"), (snowman,))
        self.assertEqual(snowman.encode("utf-8"), b(cur.fetchone()[0]))
        self.assertEqual(("SELECT '%s';" % snowman).encode('utf8'),
            cur.mogrify(_u(b"SELECT %s;"), (snowman,)).replace(b("E'"), b("'")))
Beispiel #7
0
 def test_full_escaped_octal(self):
     buf = ''.join(("\\%03o" % i) for i in range(256))
     rv = self.cast(b(buf))
     if sys.version_info[0] < 3:
         self.assertEqual(rv, ''.join(map(chr, range(256))))
     else:
         self.assertEqual(rv, bytes(range(256)))
 def test_full_escaped_octal(self):
     buf = ''.join(("\\%03o" % i) for i in range(256))
     rv = self.cast(b(buf))
     if sys.version_info[0] < 3:
         self.assertEqual(rv, ''.join(map(chr, range(256))))
     else:
         self.assertEqual(rv, bytes(range(256)))
 def test_full_hex(self, upper=False):
     buf = ''.join(("%02x" % i) for i in range(256))
     if upper: buf = buf.upper()
     buf = '\\x' + buf
     rv = self.cast(b(buf))
     if sys.version_info[0] < 3:
         self.assertEqual(rv, ''.join(map(chr, range(256))))
     else:
         self.assertEqual(rv, bytes(range(256)))
Beispiel #10
0
 def test_full_hex(self, upper=False):
     buf = ''.join(("%02x" % i) for i in range(256))
     if upper: buf = buf.upper()
     buf = '\\x' + buf
     rv = self.cast(b(buf))
     if sys.version_info[0] < 3:
         self.assertEqual(rv, ''.join(map(chr, range(256))))
     else:
         self.assertEqual(rv, bytes(range(256)))
Beispiel #11
0
    def test_adapt_subtype_3(self):
        from psycopg2cffi.extensions import adapt, register_adapter, AsIs

        class A: pass
        class B(A): pass

        register_adapter(A, lambda a: AsIs("a"))
        try:
            self.assertEqual(b("a"), adapt(B()).getquoted())
        finally:
           del extensions.adapters[A, extensions.ISQLQuote]
Beispiel #12
0
    def test_mogrify_decimal_explodes(self):
        # issue #7: explodes on windows with python 2.5 and psycopg 2.2.2
        try:
            from decimal import Decimal
        except:
            return

        conn = self.conn
        cur = conn.cursor()
        self.assertEqual(b('SELECT 10.3;'),
            cur.mogrify("SELECT %s;", (Decimal("10.3"),)))
Beispiel #13
0
    def getquoted(self):
        if self.name is None:
            raise NotImplementedError(
                'RangeAdapter must be subclassed overriding its name '
                'or the getquoted() method')

        r = self.adapted
        if r.isempty:
            return b("'empty'::" + self.name)

        if r.lower is not None:
            a = adapt(r.lower)
            if hasattr(a, 'prepare'):
                a.prepare(self._conn)
            lower = a.getquoted()
        else:
            lower = b('NULL')

        if r.upper is not None:
            a = adapt(r.upper)
            if hasattr(a, 'prepare'):
                a.prepare(self._conn)
            upper = a.getquoted()
        else:
            upper = b('NULL')

        return b(self.name + '(') + lower + b(', ') + upper \
                + b(", '%s')" % r._bounds)
Beispiel #14
0
    def getquoted(self):
        if self.name is None:
            raise NotImplementedError(
                'RangeAdapter must be subclassed overriding its name '
                'or the getquoted() method')

        r = self.adapted
        if r.isempty:
            return b("'empty'::" + self.name)

        if r.lower is not None:
            a = adapt(r.lower)
            if hasattr(a, 'prepare'):
                a.prepare(self._conn)
            lower = a.getquoted()
        else:
            lower = b('NULL')

        if r.upper is not None:
            a = adapt(r.upper)
            if hasattr(a, 'prepare'):
                a.prepare(self._conn)
            upper = a.getquoted()
        else:
            upper = b('NULL')

        return b(self.name + '(') + lower + b(', ') + upper \
                + b(", '%s')" % r._bounds)
    def test_adapt_subtype_3(self):
        from psycopg2cffi.extensions import adapt, register_adapter, AsIs

        class A:
            pass

        class B(A):
            pass

        register_adapter(A, lambda a: AsIs("a"))
        try:
            self.assertEqual(b("a"), adapt(B()).getquoted())
        finally:
            del extensions.adapters[A, extensions.ISQLQuote]
Beispiel #16
0
    def test_adapt_most_specific(self):
        from psycopg2cffi.extensions import adapt, register_adapter, AsIs

        class A(object): pass
        class B(A): pass
        class C(B): pass

        register_adapter(A, lambda a: AsIs("a"))
        register_adapter(B, lambda b: AsIs("b"))
        try:
            self.assertEqual(b('b'), adapt(C()).getquoted())
        finally:
           del extensions.adapters[A, extensions.ISQLQuote]
           del extensions.adapters[B, extensions.ISQLQuote]
Beispiel #17
0
    def test_escaped_mixed(self):
        import string
        buf = ''.join(("\\%03o" % i) for i in range(32))
        buf += string.ascii_letters
        buf += ''.join('\\' + c for c in string.ascii_letters)
        buf += '\\\\'
        rv = self.cast(b(buf))
        if sys.version_info[0] < 3:
            tgt = ''.join(map(chr, range(32))) \
                + string.ascii_letters * 2 + '\\'
        else:
            tgt = bytes(range(32)) + \
                (string.ascii_letters * 2 + '\\').encode('ascii')

        self.assertEqual(rv, tgt)
    def test_escaped_mixed(self):
        import string
        buf = ''.join(("\\%03o" % i) for i in range(32))
        buf += string.ascii_letters
        buf += ''.join('\\' + c for c in string.ascii_letters)
        buf += '\\\\'
        rv = self.cast(b(buf))
        if sys.version_info[0] < 3:
            tgt = ''.join(map(chr, range(32))) \
                + string.ascii_letters * 2 + '\\'
        else:
            tgt = bytes(range(32)) + \
                (string.ascii_letters * 2 + '\\').encode('ascii')

        self.assertEqual(rv, tgt)
    def test_adapt_most_specific(self):
        from psycopg2cffi.extensions import adapt, register_adapter, AsIs

        class A(object):
            pass

        class B(A):
            pass

        class C(B):
            pass

        register_adapter(A, lambda a: AsIs("a"))
        register_adapter(B, lambda b: AsIs("b"))
        try:
            self.assertEqual(b('b'), adapt(C()).getquoted())
        finally:
            del extensions.adapters[A, extensions.ISQLQuote]
            del extensions.adapters[B, extensions.ISQLQuote]
Beispiel #20
0
    def getquoted(self):
        r = self.adapted
        if r.isempty:
            return b("'empty'")

        if not r.lower_inf:
            # not exactly: we are relying that none of these object is really
            # quoted (they are numbers). Also, I'm lazy and not preparing the
            # adapter because I assume encoding doesn't matter for these
            # objects.
            lower = adapt(r.lower).getquoted().decode('ascii')
        else:
            lower = ''

        if not r.upper_inf:
            upper = adapt(r.upper).getquoted().decode('ascii')
        else:
            upper = ''

        return ("'%s%s,%s%s'" % (
            r._bounds[0], lower, upper, r._bounds[1])).encode('ascii')
Beispiel #21
0
    def getquoted(self):
        r = self.adapted
        if r.isempty:
            return b("'empty'")

        if not r.lower_inf:
            # not exactly: we are relying that none of these object is really
            # quoted (they are numbers). Also, I'm lazy and not preparing the
            # adapter because I assume encoding doesn't matter for these
            # objects.
            lower = adapt(r.lower).getquoted().decode('ascii')
        else:
            lower = ''

        if not r.upper_inf:
            upper = adapt(r.upper).getquoted().decode('ascii')
        else:
            upper = ''

        return ("'%s%s,%s%s'" %
                (r._bounds[0], lower, upper, r._bounds[1])).encode('ascii')
Beispiel #22
0
    def _getquoted_8(self):
        """Use the operators available in PG pre-9.0."""
        if not self.wrapped:
            return b("''::hstore")

        adapt = _ext.adapt
        rv = []
        for k, v in self.wrapped.iteritems():
            k = adapt(k)
            k.prepare(self.conn)
            k = k.getquoted()

            if v is not None:
                v = adapt(v)
                v.prepare(self.conn)
                v = v.getquoted()
            else:
                v = b('NULL')

            # XXX this b'ing is painfully inefficient!
            rv.append(b("(") + k + b(" => ") + v + b(")"))

        return b("(") + b('||').join(rv) + b(")")
Beispiel #23
0
    def _getquoted_8(self):
        """Use the operators available in PG pre-9.0."""
        if not self.wrapped:
            return b("''::hstore")

        adapt = _ext.adapt
        rv = []
        for k, v in self.wrapped.iteritems():
            k = adapt(k)
            k.prepare(self.conn)
            k = k.getquoted()

            if v is not None:
                v = adapt(v)
                v.prepare(self.conn)
                v = v.getquoted()
            else:
                v = b('NULL')

            # XXX this b'ing is painfully inefficient!
            rv.append(b("(") + k + b(" => ") + v + b(")"))

        return b("(") + b('||').join(rv) + b(")")
Beispiel #24
0
 def getquoted(self):
     return b("'%s'::uuid" % self._uuid)
 def testArrayMalformed(self):
     curs = self.conn.cursor()
     ss = ['', '{', '{}}', '{' * 20 + '}' * 20]
     for s in ss:
         self.assertRaises(psycopg2.DataError,
                           psycopg2.extensions.STRINGARRAY, b(s), curs)
Beispiel #26
0
 def getquoted(self):
     obj = _A(self.addr)
     if hasattr(obj, 'prepare'):
         obj.prepare(self._conn)
     return obj.getquoted() + b("::inet")
 def test_blank(self):
     rv = self.cast(b(''))
     self.assertEqual(rv, b(''))
Beispiel #28
0
 def getquoted(self):
     return b("'%s'::uuid" % self._uuid)
 def test_blank_hex(self):
     # Reported as problematic in ticket #48
     rv = self.cast(b('\\x'))
     self.assertEqual(rv, b(''))
Beispiel #30
0
 def getquoted(self):
     obj = _A(self.addr)
     if hasattr(obj, 'prepare'):
         obj.prepare(self._conn)
     return obj.getquoted() + b("::inet")
Beispiel #31
0
 def testArrayMalformed(self):
     curs = self.conn.cursor()
     ss = ['', '{', '{}}', '{' * 20 + '}' * 20]
     for s in ss:
         self.assertRaises(psycopg2.DataError,
             psycopg2.extensions.STRINGARRAY, b(s), curs)
Beispiel #32
0
 def test_blank_hex(self):
     # Reported as problematic in ticket #48
     rv = self.cast(b('\\x'))
     self.assertEqual(rv, b(''))
Beispiel #33
0
 def test_blank(self):
     rv = self.cast(b(''))
     self.assertEqual(rv, b(''))