Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
202548d6
G
Gpdb
项目概览
Greenplum
/
Gpdb
通知
7
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
Gpdb
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
202548d6
编写于
6月 09, 2001
作者:
T
Tom Lane
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Teach convert_to_scalar about datatypes timetz, inet, cidr, macaddr.
上级
e8637ec9
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
76 addition
and
3 deletion
+76
-3
src/backend/utils/adt/network.c
src/backend/utils/adt/network.c
+51
-1
src/backend/utils/adt/selfuncs.c
src/backend/utils/adt/selfuncs.c
+23
-1
src/include/utils/builtins.h
src/include/utils/builtins.h
+2
-1
未找到文件。
src/backend/utils/adt/network.c
浏览文件 @
202548d6
...
...
@@ -3,7 +3,7 @@
* is for IP V4 CIDR notation, but prepared for V6: just
* add the necessary bits where the comments indicate.
*
* $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.
29 2001/03/22 03:59:52 momjian
Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/network.c,v 1.
30 2001/06/09 22:16:18 tgl
Exp $
*
* Jon Postel RIP 16 Oct 1998
*/
...
...
@@ -16,6 +16,7 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include "catalog/pg_type.h"
#include "utils/builtins.h"
#include "utils/inet.h"
...
...
@@ -564,6 +565,55 @@ network_netmask(PG_FUNCTION_ARGS)
PG_RETURN_INET_P
(
dst
);
}
/*
* Convert a value of a network datatype to an approximate scalar value.
* This is used for estimating selectivities of inequality operators
* involving network types.
*
* Currently, inet/cidr values are simply converted to the IPv4 address;
* this will need more thought when IPv6 is supported too. MAC addresses
* are converted to their numeric equivalent as well (OK since we have a
* double to play in).
*/
double
convert_network_to_scalar
(
Datum
value
,
Oid
typid
)
{
switch
(
typid
)
{
case
INETOID
:
case
CIDROID
:
{
inet
*
ip
=
DatumGetInetP
(
value
);
if
(
ip_family
(
ip
)
==
AF_INET
)
return
(
double
)
ip_v4addr
(
ip
);
else
/* Go for an IPV6 address here, before faulting out: */
elog
(
ERROR
,
"unknown address family (%d)"
,
ip_family
(
ip
));
break
;
}
case
MACADDROID
:
{
macaddr
*
mac
=
DatumGetMacaddrP
(
value
);
double
res
;
res
=
(
mac
->
a
<<
16
)
|
(
mac
->
b
<<
8
)
|
(
mac
->
c
);
res
*=
256
*
256
*
256
;
res
+=
(
mac
->
d
<<
16
)
|
(
mac
->
e
<<
8
)
|
(
mac
->
f
);
return
res
;
}
}
/*
* Can't get here unless someone tries to use scalarltsel/scalargtsel
* on an operator with one network and one non-network operand.
*/
elog
(
ERROR
,
"convert_network_to_scalar: unsupported type %u"
,
typid
);
return
0
;
}
/*
* Bitwise comparison for V4 addresses. Add V6 implementation!
*/
...
...
src/backend/utils/adt/selfuncs.c
浏览文件 @
202548d6
...
...
@@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.9
2 2001/06/05 05:26:04
tgl Exp $
* $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.9
3 2001/06/09 22:16:18
tgl Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -1326,6 +1326,9 @@ icnlikejoinsel(PG_FUNCTION_ARGS)
* scale needed by scalarltsel()/scalargtsel().
* Returns "true" if successful.
*
* XXX this routine is a hack: ideally we should look up the conversion
* subroutines in pg_type.
*
* All numeric datatypes are simply converted to their equivalent
* "double" values. XXX what about NUMERIC values that are outside
* the range of "double"?
...
...
@@ -1398,10 +1401,22 @@ convert_to_scalar(Datum value, Oid valuetypid, double *scaledvalue,
case
RELTIMEOID
:
case
TINTERVALOID
:
case
TIMEOID
:
case
TIMETZOID
:
*
scaledvalue
=
convert_timevalue_to_scalar
(
value
,
valuetypid
);
*
scaledlobound
=
convert_timevalue_to_scalar
(
lobound
,
boundstypid
);
*
scaledhibound
=
convert_timevalue_to_scalar
(
hibound
,
boundstypid
);
return
true
;
/*
* Built-in network types
*/
case
INETOID
:
case
CIDROID
:
case
MACADDROID
:
*
scaledvalue
=
convert_network_to_scalar
(
value
,
valuetypid
);
*
scaledlobound
=
convert_network_to_scalar
(
lobound
,
boundstypid
);
*
scaledhibound
=
convert_network_to_scalar
(
hibound
,
boundstypid
);
return
true
;
}
/* Don't know how to convert */
return
false
;
...
...
@@ -1694,6 +1709,13 @@ convert_timevalue_to_scalar(Datum value, Oid typid)
}
case
TIMEOID
:
return
DatumGetTimeADT
(
value
);
case
TIMETZOID
:
{
TimeTzADT
*
timetz
=
DatumGetTimeTzADTP
(
value
);
/* use GMT-equivalent time */
return
(
double
)
(
timetz
->
time
+
timetz
->
zone
);
}
}
/*
...
...
src/include/utils/builtins.h
浏览文件 @
202548d6
...
...
@@ -7,7 +7,7 @@
* Portions Copyright (c) 1996-2001, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
* $Id: builtins.h,v 1.1
49 2001/06/07 00:09:31 momjian
Exp $
* $Id: builtins.h,v 1.1
50 2001/06/09 22:16:17 tgl
Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -514,6 +514,7 @@ extern Datum network_broadcast(PG_FUNCTION_ARGS);
extern
Datum
network_host
(
PG_FUNCTION_ARGS
);
extern
Datum
network_show
(
PG_FUNCTION_ARGS
);
extern
Datum
network_abbrev
(
PG_FUNCTION_ARGS
);
extern
double
convert_network_to_scalar
(
Datum
value
,
Oid
typid
);
/* mac.c */
extern
Datum
macaddr_in
(
PG_FUNCTION_ARGS
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录