资源描述:
《用mysql源码进行sql解析》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、用mysql源码进行SQL解析Mysql是通过yacc进行SQL语句解析的,这里介绍一下如何使用mysql的源码进行SQL语句解析。由于Mysql的源代码注释比较少,而且缺少资料,所有些地方研宄不够深入。1Filed介绍MYSQL中Filed有以下几种类型:enunienunifieldtypes{MYSQ'TYPEDECIMAL,MYSQLTYPETINY,MYSQ.TYPESHORT,MYSQLTYPELONG,MYSQ.TYPEFLOAT,MYSQLTYPEDOUBLE,MYSQ.TYPENULL,MYSQLTYPETTMESTAMP,MYSQ.TYPELO
2、NGLONG,MYSQLTYPETNT24,MYSQ.TYPEDATE,MYSQLTYPETTME,MYSQ.TYPEDATETTME,MYSQLTYPEYEAR,MYSQ.TYPENEWDATE,MYSQ.TYPEENUM=247,MYSQ.TYPESET=248,MYSQ.TYPETTNYBLOB=249,MYSQ.TYPEMEDIUMBLOB=250,MYSQLTYPEL0NG_BL0B=251,MYSQ.TYPEBLOB=252,MYSQ.TYPEVARSTRTNG=253,MYSQ.TYPESTRING=254,MYSQ.TYPEGEOMETRY=255
3、};下图列出几种常用的Filed子类及其关系2ITEM介绍在MYSQL中,有以下ITEM大类型:FIELDITEM,FUNCITEM,SUMFUNCITEM,STRINGITEM,TNTITEM,REALITEM,NULLITEM,VARBTNITEM,COPYSTRITEM,FIELDAVGITEM,DEFAULTVALUEITEM,PROCITEM,CONDITEM,REFITEM,FTELDSTDITEM,FIELDVARIANCEITEM,TKSERTVALUETTEM,SUBSELECTITEM,ROWITEM,CACHEITEM,TYPEHOLDER,
4、PARAMTTEM其中许多ITEM还有小类,如Item^func有如卜小类型:UNKNOWNFUNC,EQFUNC,EQUAL_FUNC,NE_FUNC,LT._FUNC,LE_FUNC,GE_EUNC,GT._EUNC,n_EUNC,LIKEFUNC,NOTL1KEFUNC,ISNULLFUNC,ISNOTNULLFUNC,CONDANDFUNC,CONDORFUNC,CONDXORFUNC,BETWEEN,IN_FUNC,1NTERVAL_EUNC,ISNOTNULLTEST.EUNC,SP_EQUALS_EUNC,SFDISJOINT_FUNC,SPINTE
5、RSECTSFUNC,SPTOUCHESFUNC,SPCROSSESFUNC,SPWITHINFUNC,SFCONTAINS_FUNC,SPOVERLAPS_FUNC,SPSTARTPOINT,SP.ENDPOINT,SPEXTERIORRING,SP_PO1NTN,SP_GEOMETRYN,SP_1NTER1ORR1NGN,NOT.FUNC,NOT_ALL_EUNC,NOW_FUNC,VAR_VALUE_FUNC下阁足对所用的主耍的ITEM子类以及关系:3FIELD和ITEM的关系通过Item类中的tmp_table_field_from_field_type函
6、数将一个Item类转化为一个Filed类返回。并不是所冇的Item类返回的Filed都冇意义,下面列举几个冇意义的转化:ltem」nt->Field_longlongltem_real->Field_doubleltem_string->Field_string4解析结果存放实例例如语句selecttablel.fieldl,*test*,100fromtablelwheretablel.fieldl:’fieldl’and(tablel.field2=100ortablel.field2=200)1)选择域的解析“tablel.fieldl,’test’,100
7、”将被解析为一个List〈Item〉Jt中List的第一个元素Item的子类Item_neld,表示表屮的列。第二个元素为Item_string,表示字符串。由val_str方法可获得string值’’test’’,也可用tmp_tab1e_fie1d_from_fie1d_type方法返回一个Field的子类Field—string的指针。第三个元素为Itemjnt,表示整数。由valjnt获得int值100,也可以用tmp_tab1e_fie1d_from_fie1d_type方法返回一个Field的子类Field_longlong的指针。2)Where域的解
8、析wher