3
=h
x                 @   s   d dl Z d dlZd dlmZ d dlT d dlmZ d dlmZ dddd	d
Z	ddddddZ
ddddZddddddZdd Zdd Zdd Zd d! ZG d"d# d#eZdS )$    N)COLLATIONS_DICT)*)COLUMN_TYPE)SUB_PARTITIONZDYNAMIC
COMPRESSED	REDUNDANTCOMPACT)            zPRIMARY zUNIQUE  z	FULLTEXT zSPATIAL )   r	   r
   r   r   zBTREE+ZSPATIALZFULLTEXT)r	   r
   r   HASHKEYRANGEZLIST)r   r   r
         c             C   s<   i }x2| j dD ]$}|dkrq|j d\}}|||< qW |S )N;r   =)split)dataddxkv r   </root/work/ibd2sql-ibd2sql-v2.x/ibd2sql/innodb_page/table.pystr2dict%   s    r   c             C   s0   i }x&| D ]}t j|d j ||d < q
W |S )Nnameindex)base64	b64decodedecode)r   r   r   r   r   r   element_b64_format.   s    
r$   c             C   sX   xR|D ]J}|| }|d }|d |kr|d r| j d| dd| d| d} qW | S )zO
	`colname` --> convert(`colname`using charset) if column['charset']!=charset
	r   character_set_nameis_var`z	convert(`z` using ))replace)r   columncharsetcolidcolcolnamer   r   r   auto_col_convert:   s    
&r/   c             C   s  | d }t | d }t | d }| d dkr8|jdd |dkrd|dkrd| d dkrd|jd	d
 n(|d(kr|d| d t| d   d7 } n|d)kr|d| d  d7 }| d r|d7 }| d r|d7 }n|dk r|d| d  d| d  d7 }n|d*kr0d | kr0| d  d!kr0|d| d   d7 }n\|d"kr^| d d!kr^|d| d  d7 }n.|d+kr|ddjd%d& | d' D  d7 }|S ),NtypeZname2collation_id?   charbinary      textblobvarchar(char_lengthcharacter_set_maxlenr(   inttinyintsmallint	mediumintbigintis_unsignedz	 unsignedis_zerofillz	 zerofilldecimalnumeric_precision,numeric_scaletime	timestampdatetimedatetime_precisionr   bitenumsetc             S   s"   g | ]}t tj|d  j qS )r   )reprr!   r"   r#   ).0r   r   r   r   
<listcomp>]   s    z$column_type_utf8.<locals>.<listcomp>elements)r3   r9   )r=   r>   r?   r@   rA   )rH   rI   rJ   )rM   rN   )r   r)   r=   join)r-   Zcol_typeZcol_type_namer   r   r   r   column_type_utf8F   s0    $

 "
$rT   c               @   s   e Zd ZdZd/ddZdd Zdd Zd	d
 Zdd Zdd Z	dd Z
d0ddZdd Zdd Zd1ddZdd Zd2ddZd3ddZd d! Zd4d"d#Zd5d%d&Zd'd( Zd6d)d*Zd+d, Zd-d. ZdS )7TABLEa  
	INPUT:
		sdi: sdi data(json), only one table
		schema: set new schema name
		name: set new table name
	RETURN:
		TBALE OBJ

	ATTR:
		sdi: sdi metadata(json)
		row_format:
		column: all column(rowid,trxid,rollptr,delete_rows,gen_pk...)
		pk: primary key
		pkmr: primary key multi row version()
		name: table name
		schema: schema name
		comment:
		collate: charset
		engine: innodb
		encryption:True,False
		compression:None,zlib,lz4
		#STATS_PERSISTENT:
		_column: column obj
		_index: index obj
		_partition: partition obj
		_reference: foregin key
		_check: check constraint
		
	FUNC:
		get_ddl: get ddl

	pkmr:{
		row_version:{
			colid:[1,2...],
			null_count:n
		}, ....
	}
	Nc             C   sh   d| _ d| _d| _d| _|| _g | _|d k	r0|n| jd d | _|d k	rL|n| jd d | _| j  d S )Nr'   z  zCREATE TABLE IF NOT EXISTS F	dd_object
schema_refr   )		_enclosed_start_predisable_foreign_keysdiddl_history_listschemar   init)selfr\   r^   r   r   r   r   __init__   s    zTABLE.__init__c             C   s  | j d }t|d }d| _|d | _t|d  | _d| _d| _i | _|d | _	|d | _
|d | _|d	 | _| j|d	 | _| j|d	 | _|d
 | _d|kr|d dkrdnd| _d|krt|d nd| _d|krdnd| _d|kr|d nd| _| j  | j  | j  | j  d S )NrV   optionsr   mysql_version_id
row_formatr   rW   commentr1   engineZencrypt_typeNFTpack_recordcompressr   )r\   r   max_row_versionrc   
ROW_FORMATrd   col_rollptr	col_trxidpkmrr   r^   re   Zcollate_get_character_set_namer%   _get_collation_namecollation_namerf   
encryptionr=   rh   compressionZcompression_typeinit_column
init_index	init_pkmrinit_pk_null_count)r`   rV   rb   r   r   r   r_      s.    






z
TABLE.initc             C   s   t t| d }|S )NCHARACTER_SET_NAME)r   str)r`   r1   rx   r   r   r   ro      s    zTABLE._get_character_set_namec             C   s$   t t| d }t t| d }|S )NCOLLATION_NAMErx   )r   ry   )r`   r1   rz   rx   r   r   r   rp      s    zTABLE._get_collation_namec             C   s   t t| d S )NMAXLEN)r   ry   )r`   r1   r   r   r   _get_character_set_maxlen   s    zTABLE._get_character_set_maxlenc                s   fddj d d D  tdd  D _g _x<jD ]2}j| }|d dkr>jj|d |d	 f q>W d
d  D   fddtt D }|j  t fdd|D _d S )Nc                s   g | ]} j |qS r   )_init_column)rP   r-   )r`   r   r   rQ      s    z%TABLE.init_column.<locals>.<listcomp>rV   columnsc             S   s   g | ]}|d  d |fqS )ordinal_positionr   r   )rP   r-   r   r   r   rQ      s    hiddenr   r   defaultc             S   s   g | ]}|qS r   r   )rP   r-   r   r   r   rQ      s    c                s   g | ]} | d  |gqS )physical_posr   )rP   r   )r*   r   r   rQ      s    c                s    g | ]}|d   |d  fqS )r   r   r   )rP   r   )r*   r   r   rQ      s    )	r\   dictr*   column_orderappendrangelensortZ	ph_column)r`   r,   r-   Zcolumn2r   )r*   r`   r   rt      s    
zTABLE.init_columnc             C   sh
  t |d  d |d< |d dkr$dnd|d< t |d  d |d	< | j|d
 |d< | j|d
 |d< | j|d
 |d< |d dkrt||d< |d rdn
t|d |d< d|kri n
t|d }d|ksd|ksd|ksd|kr| jdkr|  jd7  _| j|d< d|d< nrd|kr dn
t	|d |d< d|kr>dn
t	|d |d< |d dkrrt
|d |d | jnt
| j|d | _nd|d< d|d< d|krt	|d n
|d d |d< d|krdn|d |d< d|d< d |d < g |d!< d"d# |d$ D |d%< |d& d d' }|d d(kr>d|d< d)|d< t|d < n|d d*krvd|d< d)|d< t|d < |d d | _n|d d+krd|d< d,|d< t|d < |d d | _np|d d-kr| jd.kr|d/ r|d0 d1krd|d< d2|d< t|d < n"|d	 dkrjt|d5 |d6  }t|d6 }td7d# |D td7d# |D  |d< ||g|d!< t|d < n|d	 dkrd|d< |d/ rtnt|d < n|d	 dkrd'|d< |d/ rtnt|d < nT|d	 dkrd1|d< |d/ rtnt|d < n$|d	 dkrd1|d< t|d < n|d	 dkr>d2|d< t|d < n|d	 dkrrd1| |d< t|d < |d& g|d!< n|d	 dkrd2|d< |d/ rtnt|d < n||d	 dkrdA|d< |d/ rtnt|d < nL|d	 dkrdA|d< t|d < n*|d	 dkr(dA| |d< t |d < |d& g|d!< n|d	 dkr\dH| |d< t!|d < |d& g|d!< n|d	 dkr~d|d< t"|d < n|d	 dkr|d }|dQkrt#|d < 
q|dRkrt$|d < 
q|dSkrt%|d < 
q|dTkrt&|d < 
q|dUkrt'|d < 
q|dVkrt(|d < 
q|dWkr.t)|d < 
q|dXkrDt*|d < 
q|dYkrZt+|d < 
q|dZkrpt,|d < 
q|d[krt-|d < 
q|d\krt.|d < 
q|d]krt/|d < 
q|d^krt0|d < 
q|d_krt1|d < 
q|d`krt2|d < 
q|dakr
t3|d < 
q|dbkr t4|d < 
q|dckr6t5|d < 
q|ddkrLt6|d < 
q|dekrbt7|d < 
q|dfkrxt8|d < 
q|dgkrt9|d < 
q|dhkrt:|d < 
q|dikrt;|d < 
q|djkrt<|d < 
q|dkkrt=|d < n|dlkrt>|d < n|dmkrt?|d < n|dnkr t@|d < n|dokr4tA|d < n|dpkrHtB|d < n|dqkr\tC|d < n|drkrptD|d < nl|dskrtE|d < nX|dtkrtF|d < nD|dukrtG|d < n0|dvkrtH|d < n|dwkrtI|d < ntJ|d < n>|d	 dk	r|d5 d, d2 |d< tK|d < n|d	 dk	rVtL|d$ dzk	r2d'nd|d< tM|d < tN|d$ f|d!< n|d	 dk	rtL|d$ d, d2 |d< |d dHk	rd2n|d |d< tO|d < tN|d$ f|d!< nh|d	 dk	rtP|d < d}|k	r|d} fnd|d!< n4|d	 dk
rtQ|d < n|d	 dk
rtR|d < ni S |d	 dk
r4d|d< |d dk
rd|d dk
rd|d |d< d|d< |S )Nr0   r&   r;      TFis_bigr   	type_namer1   r%   r<   rq   rT   r   default_value_utf8_nullnulldefault_value_utf8r   se_private_dataversion_droppedversion_addedZdefault_nulli8 r   B   r   r   r   table_idsizer#   argsc             S   s   g | ]}t j|d  j qS )r   )r!   r"   r#   )rP   r   r   r   r   rQ      s    z&TABLE._init_column.<locals>.<listcomp>rR   elementrK   r	   	DB_ROW_ID   	DB_TRX_IDDB_ROLL_PTRr   Z	my_row_idi8 rB   r   r   r   DECIMAL
NEWDECIMALrE   rG   c             S   s   g | ]}|d  qS )r   r   )rP   r   r   r   r   rQ     s    TINYSHORTLONGFLOATDOUBLE	TIMESTAMP
TIMESTAMP2LONGLONGINT24r
   DATENEWDATETIMETIME2DATETIME	DATETIME2r   YEARVARCHAR
VAR_STRINGSTRING	TINY_BLOBMEDIUM_BLOB	LONG_BLOBBLOBr4   armscii8asciibig5cp1250cp1251cp1256cp1257cp850cp852cp866cp932dec8eucjpmseuckrgb18030gb2312gbkgeostd8greekhebrewhp8keybcs2koi8rkoi8ulatin1latin2latin5latin7maccemacromansjisswe7tis620ucs2ujisutf16utf16leutf32BITENUM   SETGEOMETRYsrs_idJSONVECTOR   1)r   r   )r   )r   )r   )r   )r   )r   r   )r   )r   )r   r   )r   r   )r   r   )r   )r   r   r   r   r   r   r   )r   )r   )r   )r   )r   )r   )r   )r   r   r   r   )Sr   ro   r|   rp   rT   rO   r   rc   rj   r=   maxB2UINT6rm   B2UINT7rl   B2UINT8map_decimalsum	B2DECIMALB2UINT1B2INT1B2UINT2B2INT2B2UINT4B2INT4B2FLOATB2DOUBLEB2TIMESTAMPB2INT8B2UINT3B2INT3B2DATEB2TIME
B2DATETIMEB2YEARB2STR_binaryB2STR_armscii8B2STR_ascii
B2STR_big5B2STR_cp1250B2STR_cp1251B2STR_cp1256B2STR_cp1257B2STR_cp850B2STR_cp852B2STR_cp866B2STR_cp932
B2STR_dec8B2STR_eucjpmsB2STR_euckrB2STR_gb18030B2STR_gb2312	B2STR_gbkB2STR_geostd8B2STR_greekB2STR_hebrew	B2STR_hp8B2STR_keybcs2B2STR_koi8rB2STR_koi8uB2STR_latin1B2STR_latin2B2STR_latin5B2STR_latin7B2STR_macceB2STR_macroman
B2STR_sjis
B2STR_swe7B2STR_tis620
B2STR_ucs2
B2STR_ujisB2STR_utf16B2STR_utf16leB2STR_utf32
B2STR_utf8B2BITr   B2ENUMr$   B2SET
B2GEOMETRYB2JSONB2VECTOR)r`   r   r   Zdatetime_precision_sizep1p2Zcharnamer   r   r   r}      s   "

8&
(





















































zTABLE._init_columnFc          
   C   sv  d}xb| j D ]V}| j | }|d dkr,q| j}d|d  }d|d  d|d  d	}|d }	|d d
kr|	j|rt|	t| }
|	d |
 }	n|	j|rt|}
|	|
d  }	|| j |	 | j d7 }||d  d7 }|s|d | jd d kr(|d dKkr(|d|d  d|d  d7 }|d dkr| jdkrXt|d | j |d n|d }|d| d|d rxdnd d7 }nN|d dLkr||d! rdnd"7 }n&|d# r|d$ dkr|d! r|d%7 }n|d$ dkr||d! rd&nd"7 }n|d' dkr|d' j	d(d)kr(d*nd+}|sH||d! rBd&nd"7 }|| jd,krl|rld-|d'  dnd.|d'  d7 }nV|d! s|d"7 }||d d/ks|d0 d1krd.|d$  dnd.t
|d$  d7 }|d2 s|d3|d4  d57 }|d6 dkr|d7|d6  d7 }|d8 r(|d97 }|d: d;kr>|d<7 }|d= dkrd|d>t
|d=  d7 }|	dMkrpq|rF| j | j | j dB| j | j | j }|dC d)kr| jj|dC dD| dE|dFdN  dHg |d d)kr"|d d
k r"| jj|d dD| dI| j |	 | j dHg |dC d)krf||d dO dJ 7 }q|d d
kr||d dP dJ 7 }qW |d dQ S )RNr   r   Z
FTS_DOC_IDZ
_dropped_vr   z!hidden!_dropped_v_pr   _r    rT   r1   rV   r%   r   r4   zCHARACTER SET z	 COLLATE rq   generation_expressioni8 zGENERATED ALWAYS AS (z) 
is_virtualZVIRTUALZSTOREDr   r   r   r   r   is_nullablez	NOT NULL default_value_nullr   zDEFAULT NULL zNULL default_optionr(   r   TFi8 z	DEFAULT (zDEFAULT r2   r0      srs_id_nullz/*!80003 SRID r   z */ update_optionz
ON UPDATE is_auto_incrementzAUTO_INCREMENT r   r   z/*!80023 INVISIBLE */ re   zCOMMENT r   r   r   .r   zALTER TABLE z ADD COLUMN r	   r   r   z DROP COLUMN z,
)r   r4   )r   r   r   r   )r   r   r   r8  r8  )r*   rY   endswithr   
startswithrX   r\   rc   r/   findrO   r^   r   r]   r   )r`   ddl_historyZwith_collatetddlr,   r-   ddlZ
colname_rmZcolname_rm2r.   Zcolname_lenr.  Zis_exprZtable_schema_namer   r   r   _get_ddl_column  sz    


*("
8
D


**.zTABLE._get_ddl_columnc                s4    fdd j d d D }tdd |D  _d S )Nc                s   g | ]} j |qS r   )_init_index)rP   idx)r`   r   r   rQ     s    z$TABLE.init_index.<locals>.<listcomp>rV   indexesc             S   s   g | ]}|d  d |fqS )r   r   r   )rP   rB  r   r   r   rQ     s    )r\   r   r    )r`   r    r   )r`   r   ru     s    zTABLE.init_indexc             C   s  t |d }d|kr|d ni }d|kr,dnd|d< t|d  |d< d|krT|d nd	|d< d
|krl|d
 nd	|d
< d|kr|d nd	|d< d|kr|d nd	|d< t|d  |d< d	|d< g |d< i }xtt|d D ]}|d | d }| j| }|d }|d }	|d | d }
||krLd|d | d< d|d ||  d< n>|||< |
|k rz|d rzd|d | d< nd|d | d< |
t|	 |d | d< |d | d  d8  < |d  |d rdnd	7  < |d j| qW |S )Nr   rb   ZgipkTFr0   r   rootr   Zspace_idr   idZindex_id	algorithmZalgorithm_name
null_count
colid_listrR   
column_opxr;   r<   lengthis_prer&   pre_sizer   r   r0  )r   
INDEX_TYPE	INDEX_ALGr   r   r*   r=   r   )r`   r   r   rb   Zttr   r,   r-   Zcol_lenZcol_char_maxZidx_lenr   r   r   rA    s<    

zTABLE._init_indexc             C   s  d}g }x| j D ]}| j | }| j}t|d  }|dkrL|| d7 }n$|| d| j |d  | j d7 }d}x|d D ]}	|	d	 d
krq~| j|	d  d }
| j|	d  d }|| j |
 | j |	d o|o| j|	d  d dko|dkrdt|	d  d nd 7 }|	d dkr&|d7 }|d7 }q~W |dkr>q||d d! d 7 }|d dkrr||d  d7 }|d s|d7 }|d d" }|dkr|jd| j | j | j d| j | j | j d| d ||d 7 }qW |r|S t	|d kr|d d# S dS )$Nr   r0   zPRIMARY zKEY r   r-  r:   rR   rJ  l    rI  r&   rK     z	FULLTEXT rL  r(   orderr
   z DESCrF   r   z) re   
is_visiblez/*!80000 INVISIBLE */ zALTER TABLE r7  z ADDr   z,
r	   r8  r8  r9  )
r    rY   rM  rX   r*   ry   r   r^   r   r   )r`   alterr>  	alter_ddlidxidrB  r?  Zidx_type_nameer   r.   Zisvarr   r   r   _get_ddl_index  s>    
$\


:zTABLE._get_ddl_indexc             C   s  d}| j }t|d d  }t|d d  }| jdkrD| j d d }n|dkrZt|d }n|dkr|dkrd	| d
|d d  dt|d d  d}n~|dkrdnd}d	| d|d d  d}xB|d d D ]2}|d|d  d| d
|d  d|d  d	7 }qW |d d d }n |S )Nr   rV   subpartition_typepartition_typei8  subpartition_expressionr   r   z/*!50100 PARTITION BY z (partition_expression_utf8z)
PARTITIONS 
partitionsz */r   z	LESS THANINr:   z)
(z PARTITION r   z VALUES Zdescription_utf8z) ENGINE = rf   z,
r	   z) */)r   r   r9  )r\   PARTITION_TYPErc   r   r   )r`   r?  r   rW  rX  optpr   r   r   _get_ddl_partitionA  s"    

.2zTABLE._get_ddl_partitionc                s  g }d}xz j d d D ]f}|d }|d }|d } j d d |krNdn j |  j d}| j |  j d	7 }d
j fdd|d D  }	d
j fdd|d D  }
d}|d dkrd}n<|d dkrd}n*|d dkrd}n|d dkrd}nd} j d j |  j d|
 d| d|	 d| }|j| |d j  j  j d j  j  j d| d7 }qW |sdjd d |D S |S )!Nr   rV   foreign_keysr   Zreferenced_table_schema_nameZreferenced_table_namerW   r7  r-  rF   c                s    g | ]} j |d    j  qS )Zreferenced_column_name)rX   )rP   r   )r`   r   r   rQ   `  s    z,TABLE._get_ddl_reference.<locals>.<listcomp>rR   c                s.   g | ]&} j t j|d   d   j  qS )rI  r   )rX   ry   r*   )rP   r   )r`   r   r   rQ   a  s    Zdelete_ruler	   z ON DELETE RESTRICTr
   z ON DELETE CASCADEZupdate_rulez ON UPDATE RESTRICTz ON UPDATE CASCADEzCONSTRAINT z FOREIGN KEY (z) REFERENCES r:   r(   zALTER TABLE z ADD z;
z,
c             S   s   g | ]}|qS r   r   )rP   r   r   r   r   rQ   p  s    )r\   rX   rS   rY   r   r^   r   )r`   rR  ZforeignsrS  ra  Zforeign_key_nameZref_schema_nameZref_table_nameZref_schem_tableZref_column_nameZforeign_column_nameZreference_optionZforeignr   )r`   r   _get_ddl_referenceW  s0    ,4
<zTABLE._get_ddl_referencec             C   s   | j }d|d krg }d}x|d d D ]t}|d }|j| j d| j |d  | j d| d |d	| j | j | j d
| j | j | j d|d  
7 }q(W |sdjdd |D S |S dS d S )Ncheck_constraintsrV   r   Zcheck_clause_utf8zCONSTRAINT r   z CHECK (r(   zALTER TABLE r7  z ADD r   z,
c             S   s   g | ]}|qS r   r   )rP   r   r   r   r   rQ   |  s    z(TABLE._get_ddl_check.<locals>.<listcomp>r8  )r\   r   rY   rX   r^   r   rS   )r`   rR  r   checkrS  ZchkZchkvr   r   r   _get_ddl_checkr  s    .>zTABLE._get_ddl_checkc       
      C   sp  | j }|d d }t|d d }t|d d }|d d dkrXdt|d d   nd}d	|krvd
t|d	  nd}d|krdt|d d  nd}d}d|kr|d|d  7 }d|kr|d dkr|d7 }d|kr|d dkr|d7 }d|kr t|d dkr |d|d  7 }d|d d  | d| j d| j |dkrXdt| nd | | | }	|	S )NrV   re   rb   r   rd   r
   z ROW_FORMAT=r   ri   z COMPRESSION=Zautoincz AUTO_INCREMENT=r   Zstats_persistentz STATS_PERSISTENT=stats_auto_recalcz STATS_AUTO_RECALC=1r	   z STATS_AUTO_RECALC=0stats_sample_pagesr   z STATS_SAMPLE_PAGES=zENGINE=rf   z DEFAULT CHARSET=z	 COLLATE=z	 COMMENT )r\   r   rk   rO   r=   r%   rq   )
r`   r   re   rb   r   rd   rs   Zauto_incZstatsr?  r   r   r   _get_ddl_options  s$    *"LzTABLE._get_ddl_optionsc       	   	   C   s   | j | j | j | j d| j | j | j d d | j| }| j|}|dkrd| rd|d| 7 }| j|}|dkr| r|d| 7 }| j }|dkr|d| 7 }|d| j  7 }| j	 }|dkr|d| 7 }|d7 }|S )	z>
		disable_key: without key info
		history_ddl: history ddl
		r7  r-  z(
r   z,
z
) 
r   )
rZ   rX   r^   r   r@  rV  rb  re  rh  r`  )	r`   r=  disable_keyr[   r?  r    Z	referencerd  	partitionr   r   r   get_ddl  s     @

zTABLE.get_ddlTc             C   s
   | j |S )N)rb  )r`   r[   r   r   r   get_ddl_reference  s    zTABLE.get_ddl_referencec             C   s   dj | jdd S )z<
		return `ALTER TABLE ADD INDEX` statement if have index
		ri  T)rS   rV  )r`   r   r   r   get_ddl_key  s    zTABLE.get_ddl_keyc             C   s<   | j |||d }| j}|j  |djdd |D 7 }|S )Nri  c             S   s   g | ]}|d  qS )r   r   )rP   r   r   r   r   rQ     s    z)TABLE.get_ddl_history.<locals>.<listcomp>)rl  r]   r   rS   )r`   r=  rj  r[   r?  Zhis_ddlr   r   r   get_ddl_history  s
    zTABLE.get_ddl_historyc             C   sb  g }g }| j d }xJ|d D ]>}|d dk rD|d  rD|j|d  |d r|j|d  qW |g krx|d d d gn|| _i }xt| jd D ]}i ||< d}g }x| jD ]v}	| j|	 }
|	| jkr|	|ks|
d	 dkrqq|
d |ko||
d k r||
d rdnd7 }|j|
d |	|
d	 g qW |j  dd |D }| jdkrZ| j| j	g| }||d||< qW | jdkrX| j
dkrXi }d}xt| jd D ]}g }d}xp| jD ]f}	| j|	 }
|	| jkr|	|ks|
d	 dks|
d |krq|j|	 ||
d rdnd7 }qW |r2||d|d< d}||d|t|d t| j < qW || _dS )u  
		when mysql_version_id <= 8.0.28:
			使用Instant新增字段时, 一定是放在最后的

		when mysql_version_id > 8.0.28:
			ADD/DROP INSTANT时, 有physical_pos 来确定当前/之前的位置
			实际上普通字段也有这个
		mr: [
			0: [key,剩余部分, 可为空的数量,ispk] 注意前缀索引
			1: [key,剩余部分, 可为空的数量,ispk]
			2: [key,剩余部分, 可为空的数量,ispk]
		]
		r   rR   rJ  l    r   rI  rK  r   r   r   r   r   r   r0  r   c             S   s   g | ]}|d  qS )r   r   )rP   r   r   r   r   rQ     s    z#TABLE.init_pkmr.<locals>.<listcomp>r   )r,   rG  i8 TFr	   N)r   r   )r   r   )r    r   pkr   rj   r*   r   rd   rm   rl   rc   r   rn   )r`   rp  Zprepkr    r   rn   row_versionrG  rH  r,   r-   Zcolid_list2Z
isfirstrowZbaserowr   r   r   rv     sV    
 

2
&zTABLE.init_pkmrc             C   sR   d| _ xF| jD ]<}| j| }|d dkr|d dkr|d r|  j d7  _ qW d S )Nr   r   r   r   r0  r   )pk_null_countr*   )r`   r,   r-   r   r   r   rw     s
    
 zTABLE.init_pk_null_count)NN)FF)F)F)F)FFF)T)FFF)__name__
__module____qualname____doc__ra   r_   ro   rp   r|   rt   r}   r@  ru   rA  rV  r`  rb  re  rh  rl  rm  rn  ro  rv   rw   r   r   r   r   rU   `   s.   &
 _
M#
"




BrU   )jsonr!   ibd2sql.utils.collationsr   ibd2sql.utils.b2dataZibd2sql.innodb_page.column_typer   Z ibd2sql.innodb_page.subpartitionr   rk   rM  rN  r]  r   r$   r/   rT   objectrU   r   r   r   r   <module>   s6   	