SQL function 在GSP中用TFunctionCall类表示。所有的function都用这个类表示。

TFunctionCall中的基本信息

一般的SQL function的语法如下:

funcName(arg1,arg2)

TFunctionCall中对应属性值:

getFunctionName() = funcName
getArgs().size() = 2
getArgs().getExpression(0) = arg1
getArgs().getExpression(1) = arg2
getFunctionType() = unknown_t

目前 getFunctionType() 表示的函数类型并不完善,用它来判断函数并不一定准确,需小心。

不规则参数的函数

一般情况下,函数的参数由TExpressionList getArgs()获得,这些函数的参数形如:

funcName(arg1,arg2,arg3)

其中,arg1,arg2,arg3的类型都是表达式:TExpression

但有一些函数的参数并不能仅仅由表达式来表示,例如cast函数,

SELECT CAST(ytd_sales AS CHAR(5)) FROM titles

除了ytd_sales可以用TExpression,还有AS关键字和CHAR(5)数据类型,所以cast函数 的参数不能用TExpressionList getArgs()获得,它对应的参数分别为:

getExpr1() = ytd_sales
getTypename() = CHAR(5)

函数的参数语法上的多样性,导致获取参数的API方式的不统一。以后API上可能需要改进以保证获取参数方法统一。

其它参数不规则的函数另行补充.

判断一个函数是否为数据库的内置函数(built-in funciton)

  1. 判断该函数是否为某一数据库的内置函数。EDbVendor 用来指定数据库厂商,例如db2,oracle等。
    public boolean isBuiltIn(EDbVendor pDBVendor)
    
  2. 静态函数,需指定函数名。功能同1.
    public static boolean isBuiltIn(String pName, EDbVendor pDBVendor)
    

aggregate function

1. ALL | DISTINCT

getAggregateType() is used to determine the ALL | DISTINCT used in the aggregate function.

2. WITHIN GROUP

This information is not available in the TFunctionCall yet.

window function

FUNCTION_NAME(expr) OVER {window_name | (window_specification)}

在Oracle and SQL Server中,window_specification也称为window_clause

在GSP中,用TWindowDef表示window_specification, 在TFunctionCall中,用以下方法获得window_specification

public TWindowDef getWindowDef()

以这个包含window function的SQL为例:

SELECT NUM, ODD,
CUME_DIST( ) OVER(PARTITION BY ODD ORDER BY NUM) cumedist
FROM test4

GSP的输出为:

sstselect
--> function: CUME_DIST, type:unknown_t
	window_specification
		Parition value: ODD
		Order by clause: NUM

CASE FUNCTION

TCaseExpression表示。

search SQL Function