浏览模式: 普通 | 列表
1

MySQL5.0 对SQL-92的兼容程度

[ 2007-04-12 21:57:28 | 作者: progame ]

虽然MySql都已经5.2Beta版了,不过我因为是以前下载的5.0,懒得再去下了,估摸着sql语法也不会有太大变化,因为SqlBroker已经移植到Java平台,那么必然要完成MySql的Translator了,很多年前,Sql Server和Oracle 8i/9i的Translator已经完成,从代码行数对比来看,MySql对标准SQL的兼容性算是不错的了,Sql Server使用了400行进行转换,MySql只用了200行,当然都是从TranslatorBase这个抽象基类派生而来的,使用的是Template模式,基类有1500行左右

那么到底需要处理哪些不兼容的地方呢?

  1. 数据类型而言兼容性不错,基本都可以找到对应
  2. OVERLAY的字段串函数同样没有,使用left right代替实现
  3. DATE_ADD, DATE_SUB, DATE_DIFF使用TIMESTAMPADD, TIMESTAMPSUB, TIMESTAMPDIFF,而这三个函数不接受interval为Microssecond
  4. ||在MySql中为or, 所以需要替换成concat
  5. LIKE的escape char中'\'是转义字符,所以如果是escape '\',则需要改为escape '\\'
  6. DATE TIME TIMESTAMP常量不需要字符标识前导
  7. CAST转换有些异样,后面不是一般的datatype定义,而是缩减为几个类型关键词
  8. 对于dirived query一定要指明alia,这点和sql server一样
  9. object使用'做为标识符
  10. 不支持full join,不支持select into new_table

在处理完这些问题后,单元测试全部通过,oh yeah!

从coco/r 迁移到 antlr 心得体会

[ 2007-03-28 21:18:47 | 作者: progame ]
终于将sql broker从coco/r迁移到antlr了,并且把单元测试都跑得通过了,总结下来,转换工作量不是太大,我加起来用了2个工作日左右,语法文件大小从原来的1200多行到现在的1500多行,首先看一个例子的不同语法定义

coco/r :
InsertValue<out InsertValue node>  =
    (. node = new InsertValue(); .)
    ("DEFAULT" (. ExceptLevel(2); node.usedefault = true; .)
    | Expression<out node.expression> )
.

antlr:
insertvalue
  returns [InsertValue node]
  { node = new InsertValue(); }
  :
  (DEFAULT { ExceptLevel(2); node.usedefault = true; }
  | {Expression exp = null;} exp = expression {node.expression = exp;} )
;

一些区别:
1、antlr中keyword必须定义在lexer中,而且不能发生LL冲突,否则需要放入tokens节,这点coco/r要方便很多
2、因为antlr的[]是参数定义,所以coco/r中的表示zero or one的 '[]'就不能用了,必须'()?'
3、{}在antlr中为代码段,等同coco/r的(..),所以不能再用它表示zero or more,而应该使用'()*'
4、coco/r 可以用t.val得到最后一个token的value,而antlr中可以使用LT(0),依此类推,还可以使用LT(1), LT(-1)...,另外就是可通过定义符号来取值
5、antlr的buildast应该比较有用,我可以通过它构建初步的AST,再根据这个AST生成我自己的AST,但因为原来coco/r是直接通过嵌入代码构造好了最终的AST,所以就没有用antlr的这个功能,况且要重复在TreeParser中定义一次类似的语法也挺烦人的
1