STINNER Victor added the comment: I added debug traces to _PyDict_Pop(). It looks like the assertion failed after dictresize() converts a splitted table into a combined table. After the resize, the key '_columns_plus_names' cannot be found anymore, whereas it was found before.
The string thing about the key '_columns_plus_names' is that I cannot see it in the output of repr(dict). The length of the dictionary is 7, but it looks like it contains 8 items... Something is wrong, no? Note: I'm not sure that my debug traces are correct, especially the number of entries may be larger. I don't understand yet exactly the internal structure of dictionaries. @@ delete memoized {'_auto_correlate': True, '_from_obj': OrderedSet([]), '_raw_columns': [Table('t1', MetaData(bind=None), Column('c1', Integer(), table=<t1>, primary_key=True, nullable=False), Column('c2', String(length=30), table=<t1>), schema=None)], '_whereclause': <sqlalchemy.sql.elements.BinaryExpression object at 0x7fffe93d1190>, '_having': None, 'use_labels': False, '_bind': None} _PyDict_Pop(): ix=7, resize! before resize: <splitted dict 0x7fffe93cda30 used=7 keys->dk_size=16 keys->dk_nentries=8 keys->dk_usable=2 || usable=10> index[0]=-1 index[1]=4 index[2]=-1 index[3]=-1 index[4]=0 index[5]=3 index[6]=-1 index[7]=7 <----- it looks like the entry #7 is referenced, no? index[8]=1 index[9]=2 index[10]=-1 index[11]=-1 index[12]=-1 index[13]=-1 index[14]=5 index[15]=6 entry[0]: key='_auto_correlate', hash=-4930419206435490684 entry[1]: key='_from_obj', hash=-717737569259548376 entry[2]: key='_raw_columns', hash=6382956110151689156 entry[3]: key='_whereclause', hash=-7105285138948878507 entry[4]: key='_having', hash=-8328824464742262616 entry[5]: key='use_labels', hash=8687253172181039710 entry[6]: key='_bind', hash=-5556925267210855474 entry[7]: key='_columns_plus_names', hash=-7771762227888271625 entry[8]: key='NULL', hash=0 entry[9]: key='NULL', hash=0 object : {'_auto_correlate': True, '_from_obj': OrderedSet([]), '_raw_columns': [Table('t1', MetaData(bind=None), Column('c1', Integer(), table=<t1>, primary_key=True, nullable=False), Column('c2', String(length=30), table=<t1>), schema=None)], '_whereclause': <sqlalchemy.sql.elements.BinaryExpression object at 0x7fffe93d1190>, '_having': None, 'use_labels': False, '_bind': None} type : dict *** after resize: <combined dict 0x7fffe93cda30 used=7 keys->dk_size=32 keys->dk_nentries=7 keys->dk_usable=14 || usable=21> index[0]=-1 index[1]=-1 index[2]=-1 index[3]=-1 index[4]=0 index[5]=-1 index[6]=-1 index[7]=-1 index[8]=1 index[9]=-1 index[10]=-1 index[11]=-1 index[12]=-1 index[13]=-1 index[14]=6 index[15]=-1 index[16]=-1 index[17]=4 index[18]=-1 index[19]=-1 index[20]=-1 index[21]=3 index[22]=-1 index[23]=-1 index[24]=-1 index[25]=2 index[26]=-1 index[27]=-1 index[28]=-1 index[29]=-1 index[30]=5 index[31]=-1 <------ no more entry #7 ??? entry[0]: key='_auto_correlate', value=True, hash=-4930419206435490684 entry[1]: key='_from_obj', value=OrderedSet([]), hash=-717737569259548376 entry[2]: key='_raw_columns', value=[Table('t1', MetaData(bind=None), Column('c1', Integer(), table=<t1>, primary_key=True, nullable=False), Column('c2', String(length=30), table=<t1>), schema=None)], hash=6382956110151689156 entry[3]: key='_whereclause', value=<sqlalchemy.sql.elements.BinaryExpression object at 0x7fffe93d1190>, hash=-7105285138948878507 entry[4]: key='_having', value=None, hash=-8328824464742262616 entry[5]: key='use_labels', value=False, hash=8687253172181039710 entry[6]: key='_bind', value=None, hash=-5556925267210855474 entry[7]: key='NULL', value='NULL', hash=0 entry[8]: key='NULL', value='NULL', hash=0 entry[9]: key='NULL', value='NULL', hash=0 entry[10]: key='NULL', value='NULL', hash=0 entry[11]: key='NULL', value='NULL', hash=0 entry[12]: key='NULL', value='NULL', hash=0 entry[13]: key='NULL', value='NULL', hash=0 entry[14]: key='NULL', value='NULL', hash=0 entry[15]: key='NULL', value='NULL', hash=0 entry[16]: key='NULL', value='NULL', hash=0 entry[17]: key='NULL', value='NULL', hash=0 entry[18]: key='NULL', value='NULL', hash=0 entry[19]: key='NULL', value='NULL', hash=0 entry[20]: key='NULL', value='NULL', hash=0 object : {'_auto_correlate': True, '_from_obj': OrderedSet([]), '_raw_columns': [Table('t1', MetaData(bind=None), Column('c1', Integer(), table=<t1>, primary_key=True, nullable=False), Column('c2', String(length=30), table=<t1>), schema=None)], '_whereclause': <sqlalchemy.sql.elements.BinaryExpression object at 0x7fffe93d1190>, '_having': None, 'use_labels': False, '_bind': None} type : dict refcount: 3 python: Objects/dictobject.c:1810: _PyDict_Pop: Assertion `ix >= 0' failed. Program received signal SIGABRT, Aborted. 0x00007ffff711f6f5 in raise () from /lib64/libc.so.6 Missing separate debuginfos, use: dnf debuginfo-install bzip2-libs-1.0.6-20.fc24.x86_64 keyutils-libs-1.5.9-8.fc24.x86_64 krb5-libs-1.14.3-8.fc24.x86_64 libcom_err-1.42.13-4.fc24.x86_64 libselinux-2.5-9.fc24.x86_64 openssl-libs-1.0.2h-3.fc24.x86_64 pcre-8.39-3.fc24.x86_64 sqlite-libs-3.13.0-1.fc24.x86_64 xz-libs-5.2.2-2.fc24.x86_64 zlib-1.2.8-10.fc24.x86_64 (gdb) up #1 0x00007ffff71212fa in abort () from /lib64/libc.so.6 (gdb) #2 0x00007ffff7117f97 in __assert_fail_base () from /lib64/libc.so.6 (gdb) #3 0x00007ffff7118042 in __assert_fail () from /lib64/libc.so.6 (gdb) #4 0x00000000004bdfd7 in _PyDict_Pop (mp=0x7fffe93cda30, key='_columns_plus_names', deflt=None) at Objects/dictobject.c:1810 1810 assert(ix >= 0); (gdb) p key $1 = '_columns_plus_names' (gdb) l 1805 fprintf(stderr, "after resize:\n"); 1806 dict_dump_key_value_table(mp); 1807 _PyObject_Dump((PyObject *)mp); 1808 1809 ix = (mp->ma_keys->dk_lookup)(mp, key, hash, &value_addr, &hashpos); 1810 assert(ix >= 0); 1811 } 1812 1813 old_value = *value_addr; 1814 assert(old_value != NULL); (gdb) p hash $2 = -7771762227888271625 (gdb) print value_addr $3 = (PyObject **) 0x0 (gdb) print value_addr $4 = (PyObject **) 0x0 (gdb) print hashpos $5 = 23 ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue28120> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com