Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Greenplum
Gpdb
提交
49d3d9cf
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,发现更多精彩内容 >>
提交
49d3d9cf
编写于
4月 21, 2004
作者:
B
Bruce Momjian
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Change COPY CSV keyword to be:
FORCE QUOTE to force quotes FORCE NOT NULL to quote null input values
上级
2d1221bf
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
135 addition
and
132 deletion
+135
-132
doc/src/sgml/ref/copy.sgml
doc/src/sgml/ref/copy.sgml
+22
-27
doc/src/sgml/ref/psql-ref.sgml
doc/src/sgml/ref/psql-ref.sgml
+3
-3
src/backend/commands/copy.c
src/backend/commands/copy.c
+51
-52
src/backend/parser/gram.y
src/backend/parser/gram.y
+6
-7
src/backend/parser/keywords.c
src/backend/parser/keywords.c
+1
-2
src/bin/psql/copy.c
src/bin/psql/copy.c
+52
-41
未找到文件。
doc/src/sgml/ref/copy.sgml
浏览文件 @
49d3d9cf
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/copy.sgml,v 1.5
6 2004/04/19 17:22:30
momjian Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/copy.sgml,v 1.5
7 2004/04/21 00:34:18
momjian Exp $
PostgreSQL documentation
-->
...
...
@@ -29,7 +29,7 @@ COPY <replaceable class="parameter">tablename</replaceable> [ ( <replaceable cla
[ NULL [ AS ] '<replaceable class="parameter">null string</replaceable>' ]
[ CSV [ QUOTE [ AS ] '<replaceable class="parameter">quote</replaceable>' ]
[ ESCAPE [ AS ] '<replaceable class="parameter">escape</replaceable>' ]
[
LITERA
L <replaceable class="parameter">column</replaceable> [, ...] ]
[
FORCE NOT NUL
L <replaceable class="parameter">column</replaceable> [, ...] ]
COPY <replaceable class="parameter">tablename</replaceable> [ ( <replaceable class="parameter">column</replaceable> [, ...] ) ]
TO { '<replaceable class="parameter">filename</replaceable>' | STDOUT }
...
...
@@ -40,7 +40,7 @@ COPY <replaceable class="parameter">tablename</replaceable> [ ( <replaceable cla
[ NULL [ AS ] '<replaceable class="parameter">null string</replaceable>' ]
[ CSV [ QUOTE [ AS ] '<replaceable class="parameter">quote</replaceable>' ]
[ ESCAPE [ AS ] '<replaceable class="parameter">escape</replaceable>' ]
[ FORCE <replaceable class="parameter">column</replaceable> [, ...] ]
[ FORCE
QUOTE
<replaceable class="parameter">column</replaceable> [, ...] ]
</synopsis>
</refsynopsisdiv>
...
...
@@ -185,10 +185,10 @@ COPY <replaceable class="parameter">tablename</replaceable> [ ( <replaceable cla
<term><literal>CSV</literal></term>
<listitem>
<para>
Enables Comma Separated Variable (<literal>CSV</>) mode.
(Also called
Comma Separated Value). It sets the default <literal>DELIMITER</> to
comma, and <literal>QUOTE</> and <literal>ESCAPE</> values to
double-quote.
Enables Comma Separated Variable (<literal>CSV</>) mode.
(Also
called Comma Separated Value). It sets the default
<literal>DELIMITER</> to comma, and <literal>QUOTE</> and
<literal>ESCAPE</> values to
double-quote.
</para>
</listitem>
</varlistentry>
...
...
@@ -207,38 +207,33 @@ COPY <replaceable class="parameter">tablename</replaceable> [ ( <replaceable cla
<term><replaceable class="parameter">escape</replaceable></term>
<listitem>
<para>
Specifies the character that should appear before a
<literal>QUOTE</>
data character value in <literal>CSV</> mode. The default is the
<literal>QUOTE</> value (usually double-quote).
Specifies the character that should appear before a
<literal>QUOTE</> data character value in <literal>CSV</> mode.
The default is the
<literal>QUOTE</> value (usually double-quote).
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>FORCE</></term>
<term><literal>FORCE
QUOTE
</></term>
<listitem>
<para>
In <literal>CSV</> <command>COPY TO</> mode, forces quoting
to be used for all non-<literal>NULL</> values in each specified
column.
<literal>NULL</> output is never quoted.
In <literal>CSV</> <command>COPY TO</> mode, forces quoting
to be
used for all non-<literal>NULL</> values in each specified column.
<literal>NULL</> output is never quoted.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>
LITERA
L</></term>
<term><literal>
FORCE NOT NUL
L</></term>
<listitem>
<para>
In <literal>CSV</> <command>COPY FROM</> mode, for each column specified,
do not do a <literal>null string</> comparison; instead load the value
literally. <literal>QUOTE</> and <literal>ESCAPE</> processing are still
performed.
</para>
<para>
If the <literal>null string</> is <literal>''</> (the default
in <literal>CSV</> mode), a missing input value (<literal>delimiter,
delimiter</>), will load as a zero-length string. <literal>Delimiter, quote,
quote, delimiter</> is always treated as a zero-length string on input.
In <literal>CSV</> <command>COPY FROM</> mode, process each
specified column as though it were quoted and hance not a
<literal>NULL</> value. For the default <literal>null string</> in
<literal>CSV</> mode (<literal>''</>), this causes a missing
values to be input as a zero-length strings.
</para>
</listitem>
</varlistentry>
...
...
@@ -483,7 +478,7 @@ COPY <replaceable class="parameter">tablename</replaceable> [ ( <replaceable cla
suffixed by the <literal>QUOTE</> character, and any occurrence
within the value of a <literal>QUOTE</> character or the
<literal>ESCAPE</> character is preceded by the escape character.
You can also use <literal>FORCE</> to force quotes when outputting
You can also use <literal>FORCE
QUOTE
</> to force quotes when outputting
non-<literal>NULL</> values in specific columns.
</para>
...
...
@@ -496,7 +491,7 @@ COPY <replaceable class="parameter">tablename</replaceable> [ ( <replaceable cla
is quoted. Therefore, using the default settings, a <literal>NULL</> is
written as an unquoted empty string, while an empty string is
written with double quotes (<literal>""</>). Reading values follows
similar rules. You can use <literal>
LITERA
L</> to prevent <literal>NULL</>
similar rules. You can use <literal>
FORCE NOT NUL
L</> to prevent <literal>NULL</>
input comparisons for specific columns.
</para>
...
...
doc/src/sgml/ref/psql-ref.sgml
浏览文件 @
49d3d9cf
<!--
$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.11
1 2004/04/19 17:22:30
momjian Exp $
$PostgreSQL: pgsql/doc/src/sgml/ref/psql-ref.sgml,v 1.11
2 2004/04/21 00:34:18
momjian Exp $
PostgreSQL documentation
-->
...
...
@@ -713,8 +713,8 @@ testdb=>
[ <literal>null [as] </literal> '<replaceable class="parameter">string</replaceable>' ]</literal>
[ <literal>csv [ quote [as] </literal> '<replaceable class="parameter">character</replaceable>' ]
[ <literal>escape [as] </literal> '<replaceable class="parameter">character</replaceable>' ]
[ <literal>force</> <replaceable class="parameter">column_list</replaceable> ]
[ <literal>
litera
l</> <replaceable class="parameter">column_list</replaceable> ] ]
[ <literal>force
quote
</> <replaceable class="parameter">column_list</replaceable> ]
[ <literal>
force not nul
l</> <replaceable class="parameter">column_list</replaceable> ] ]
</term>
<listitem>
...
...
src/backend/commands/copy.c
浏览文件 @
49d3d9cf
...
...
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.22
2 2004/04/19 21:58:02
momjian Exp $
* $PostgreSQL: pgsql/src/backend/commands/copy.c,v 1.22
3 2004/04/21 00:34:18
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -132,10 +132,10 @@ static bool line_buf_converted;
/* non-export function prototypes */
static
void
CopyTo
(
Relation
rel
,
List
*
attnumlist
,
bool
binary
,
bool
oids
,
char
*
delim
,
char
*
null_print
,
bool
csv_mode
,
char
*
quote
,
char
*
escape
,
List
*
force_atts
);
List
*
force_
quote_
atts
);
static
void
CopyFrom
(
Relation
rel
,
List
*
attnumlist
,
bool
binary
,
bool
oids
,
char
*
delim
,
char
*
null_print
,
bool
csv_mode
,
char
*
quote
,
char
*
escape
,
List
*
litera
l_atts
);
List
*
force_notnul
l_atts
);
static
bool
CopyReadLine
(
void
);
static
char
*
CopyReadAttribute
(
const
char
*
delim
,
const
char
*
null_print
,
CopyReadResult
*
result
,
bool
*
isnull
);
...
...
@@ -695,10 +695,10 @@ DoCopy(const CopyStmt *stmt)
char
*
quote
=
NULL
;
char
*
escape
=
NULL
;
char
*
null_print
=
NULL
;
List
*
force
=
NIL
;
List
*
litera
l
=
NIL
;
List
*
force_atts
=
NIL
;
List
*
litera
l_atts
=
NIL
;
List
*
force
_quote
=
NIL
;
List
*
force_notnul
l
=
NIL
;
List
*
force_
quote_
atts
=
NIL
;
List
*
force_notnul
l_atts
=
NIL
;
Relation
rel
;
AclMode
required_access
=
(
is_from
?
ACL_INSERT
:
ACL_SELECT
);
AclResult
aclresult
;
...
...
@@ -764,21 +764,21 @@ DoCopy(const CopyStmt *stmt)
errmsg
(
"conflicting or redundant options"
)));
escape
=
strVal
(
defel
->
arg
);
}
else
if
(
strcmp
(
defel
->
defname
,
"force"
)
==
0
)
else
if
(
strcmp
(
defel
->
defname
,
"force
_quote
"
)
==
0
)
{
if
(
force
)
if
(
force
_quote
)
ereport
(
ERROR
,
(
errcode
(
ERRCODE_SYNTAX_ERROR
),
errmsg
(
"conflicting or redundant options"
)));
force
=
(
List
*
)
defel
->
arg
;
force
_quote
=
(
List
*
)
defel
->
arg
;
}
else
if
(
strcmp
(
defel
->
defname
,
"
litera
l"
)
==
0
)
else
if
(
strcmp
(
defel
->
defname
,
"
force_notnul
l"
)
==
0
)
{
if
(
litera
l
)
if
(
force_notnul
l
)
ereport
(
ERROR
,
(
errcode
(
ERRCODE_SYNTAX_ERROR
),
errmsg
(
"conflicting or redundant options"
)));
litera
l
=
(
List
*
)
defel
->
arg
;
force_notnul
l
=
(
List
*
)
defel
->
arg
;
}
else
elog
(
ERROR
,
"option
\"
%s
\"
not recognized"
,
...
...
@@ -850,28 +850,28 @@ DoCopy(const CopyStmt *stmt)
errmsg
(
"COPY escape must be a single character"
)));
/*
* Check force
* Check force
_quote
*/
if
(
!
csv_mode
&&
force
!=
NIL
)
if
(
!
csv_mode
&&
force
_quote
!=
NIL
)
ereport
(
ERROR
,
(
errcode
(
ERRCODE_FEATURE_NOT_SUPPORTED
),
errmsg
(
"COPY force available only in CSV mode"
)));
if
(
force
!=
NIL
&&
is_from
)
errmsg
(
"COPY force
quote
available only in CSV mode"
)));
if
(
force
_quote
!=
NIL
&&
is_from
)
ereport
(
ERROR
,
(
errcode
(
ERRCODE_FEATURE_NOT_SUPPORTED
),
errmsg
(
"COPY force only available using COPY TO"
)));
errmsg
(
"COPY force
quote
only available using COPY TO"
)));
/*
* Check
litera
l
* Check
force_notnul
l
*/
if
(
!
csv_mode
&&
litera
l
!=
NIL
)
if
(
!
csv_mode
&&
force_notnul
l
!=
NIL
)
ereport
(
ERROR
,
(
errcode
(
ERRCODE_FEATURE_NOT_SUPPORTED
),
errmsg
(
"COPY
litera
l available only in CSV mode"
)));
if
(
litera
l
!=
NIL
&&
!
is_from
)
errmsg
(
"COPY
force not nul
l available only in CSV mode"
)));
if
(
force_notnul
l
!=
NIL
&&
!
is_from
)
ereport
(
ERROR
,
(
errcode
(
ERRCODE_FEATURE_NOT_SUPPORTED
),
errmsg
(
"COPY
litera
l only available using COPY FROM"
)));
errmsg
(
"COPY
force not nul
l only available using COPY FROM"
)));
/*
* Don't allow the delimiter to appear in the null string.
...
...
@@ -928,47 +928,47 @@ DoCopy(const CopyStmt *stmt)
attnumlist
=
CopyGetAttnums
(
rel
,
attnamelist
);
/*
* Check that FORCE references valid COPY columns
* Check that FORCE
QUOTE
references valid COPY columns
*/
if
(
force
)
if
(
force
_quote
)
{
TupleDesc
tupDesc
=
RelationGetDescr
(
rel
);
Form_pg_attribute
*
attr
=
tupDesc
->
attrs
;
List
*
cur
;
force_
atts
=
CopyGetAttnums
(
rel
,
forc
e
);
force_
quote_atts
=
CopyGetAttnums
(
rel
,
force_quot
e
);
foreach
(
cur
,
force_atts
)
foreach
(
cur
,
force_
quote_
atts
)
{
int
attnum
=
lfirsti
(
cur
);
if
(
!
intMember
(
attnum
,
attnumlist
))
ereport
(
ERROR
,
(
errcode
(
ERRCODE_INVALID_COLUMN_REFERENCE
),
errmsg
(
"FORCE column
\"
%s
\"
not referenced by COPY"
,
errmsg
(
"FORCE
QUOTE
column
\"
%s
\"
not referenced by COPY"
,
NameStr
(
attr
[
attnum
-
1
]
->
attname
))));
}
}
/*
* Check that
LITERA
L references valid COPY columns
* Check that
FORCE NOT NUL
L references valid COPY columns
*/
if
(
litera
l
)
if
(
force_notnul
l
)
{
List
*
cur
;
TupleDesc
tupDesc
=
RelationGetDescr
(
rel
);
Form_pg_attribute
*
attr
=
tupDesc
->
attrs
;
literal_atts
=
CopyGetAttnums
(
rel
,
litera
l
);
force_notnull_atts
=
CopyGetAttnums
(
rel
,
force_notnul
l
);
foreach
(
cur
,
litera
l_atts
)
foreach
(
cur
,
force_notnul
l_atts
)
{
int
attnum
=
lfirsti
(
cur
);
if
(
!
intMember
(
attnum
,
attnumlist
))
ereport
(
ERROR
,
(
errcode
(
ERRCODE_INVALID_COLUMN_REFERENCE
),
errmsg
(
"
LITERA
L column
\"
%s
\"
not referenced by COPY"
,
errmsg
(
"
FORCE NOT NUL
L column
\"
%s
\"
not referenced by COPY"
,
NameStr
(
attr
[
attnum
-
1
]
->
attname
))));
}
}
...
...
@@ -1037,7 +1037,7 @@ DoCopy(const CopyStmt *stmt)
}
}
CopyFrom
(
rel
,
attnumlist
,
binary
,
oids
,
delim
,
null_print
,
csv_mode
,
quote
,
escape
,
litera
l_atts
);
quote
,
escape
,
force_notnul
l_atts
);
}
else
{
/* copy from database to file */
...
...
@@ -1100,7 +1100,7 @@ DoCopy(const CopyStmt *stmt)
}
}
CopyTo
(
rel
,
attnumlist
,
binary
,
oids
,
delim
,
null_print
,
csv_mode
,
quote
,
escape
,
force_atts
);
quote
,
escape
,
force_
quote_
atts
);
}
if
(
!
pipe
)
...
...
@@ -1133,7 +1133,7 @@ DoCopy(const CopyStmt *stmt)
static
void
CopyTo
(
Relation
rel
,
List
*
attnumlist
,
bool
binary
,
bool
oids
,
char
*
delim
,
char
*
null_print
,
bool
csv_mode
,
char
*
quote
,
char
*
escape
,
List
*
force_atts
)
char
*
escape
,
List
*
force_
quote_
atts
)
{
HeapTuple
tuple
;
TupleDesc
tupDesc
;
...
...
@@ -1180,7 +1180,7 @@ CopyTo(Relation rel, List *attnumlist, bool binary, bool oids,
&
isvarlena
[
attnum
-
1
]);
fmgr_info
(
out_func_oid
,
&
out_functions
[
attnum
-
1
]);
if
(
intMember
(
attnum
,
force_atts
))
if
(
intMember
(
attnum
,
force_
quote_
atts
))
force_quote
[
attnum
-
1
]
=
true
;
else
force_quote
[
attnum
-
1
]
=
false
;
...
...
@@ -1434,7 +1434,7 @@ limit_printout_length(StringInfo buf)
static
void
CopyFrom
(
Relation
rel
,
List
*
attnumlist
,
bool
binary
,
bool
oids
,
char
*
delim
,
char
*
null_print
,
bool
csv_mode
,
char
*
quote
,
char
*
escape
,
List
*
litera
l_atts
)
char
*
escape
,
List
*
force_notnul
l_atts
)
{
HeapTuple
tuple
;
TupleDesc
tupDesc
;
...
...
@@ -1447,7 +1447,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
Oid
*
elements
;
Oid
oid_in_element
;
ExprState
**
constraintexprs
;
bool
*
literal_nullstr
;
bool
*
force_notnull
;
bool
hasConstraints
=
false
;
int
attnum
;
int
i
;
...
...
@@ -1509,7 +1509,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
defmap
=
(
int
*
)
palloc
((
num_phys_attrs
+
1
)
*
sizeof
(
int
));
defexprs
=
(
ExprState
**
)
palloc
((
num_phys_attrs
+
1
)
*
sizeof
(
ExprState
*
));
constraintexprs
=
(
ExprState
**
)
palloc0
((
num_phys_attrs
+
1
)
*
sizeof
(
ExprState
*
));
literal_nullstr
=
(
bool
*
)
palloc
((
num_phys_attrs
+
1
)
*
sizeof
(
bool
));
force_notnull
=
(
bool
*
)
palloc
((
num_phys_attrs
+
1
)
*
sizeof
(
bool
));
for
(
attnum
=
1
;
attnum
<=
num_phys_attrs
;
attnum
++
)
{
...
...
@@ -1526,10 +1526,10 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
&
in_func_oid
,
&
elements
[
attnum
-
1
]);
fmgr_info
(
in_func_oid
,
&
in_functions
[
attnum
-
1
]);
if
(
intMember
(
attnum
,
litera
l_atts
))
literal_nullstr
[
attnum
-
1
]
=
true
;
if
(
intMember
(
attnum
,
force_notnul
l_atts
))
force_notnull
[
attnum
-
1
]
=
true
;
else
literal_nullstr
[
attnum
-
1
]
=
false
;
force_notnull
[
attnum
-
1
]
=
false
;
/* Get default info if needed */
if
(
!
intMember
(
attnum
,
attnumlist
))
...
...
@@ -1748,7 +1748,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
string
=
CopyReadAttribute
(
delim
,
null_print
,
&
result
,
&
isnull
);
if
(
csv_mode
&&
isnull
&&
literal_nullstr
[
m
])
if
(
csv_mode
&&
isnull
&&
force_notnull
[
m
])
{
string
=
null_print
;
/* set to NULL string */
isnull
=
false
;
...
...
@@ -1947,7 +1947,7 @@ CopyFrom(Relation rel, List *attnumlist, bool binary, bool oids,
pfree
(
defmap
);
pfree
(
defexprs
);
pfree
(
constraintexprs
);
pfree
(
literal_nullstr
);
pfree
(
force_notnull
);
ExecDropTupleTable
(
tupleTable
,
true
);
...
...
@@ -2558,14 +2558,13 @@ CopyAttributeOut(char *server_string, char *delim)
*/
static
void
CopyAttributeOutCSV
(
char
*
server_string
,
char
*
delim
,
char
*
quote
,
char
*
escape
,
bool
forc
e_quote
)
char
*
escape
,
bool
us
e_quote
)
{
char
*
string
;
char
c
;
char
delimc
=
delim
[
0
];
char
quotec
=
quote
[
0
];
char
escapec
=
escape
[
0
];
bool
need_quote
=
force_quote
;
char
*
test_string
;
bool
same_encoding
;
int
mblen
;
...
...
@@ -2583,23 +2582,23 @@ CopyAttributeOutCSV(char *server_string, char *delim, char *quote,
*/
for
(
test_string
=
string
;
!
need
_quote
&&
(
c
=
*
test_string
)
!=
'\0'
;
!
use
_quote
&&
(
c
=
*
test_string
)
!=
'\0'
;
test_string
+=
mblen
)
{
if
(
c
==
delimc
||
c
==
quotec
||
c
==
'\n'
||
c
==
'\r'
)
need
_quote
=
true
;
use
_quote
=
true
;
if
(
!
same_encoding
)
mblen
=
pg_encoding_mblen
(
client_encoding
,
test_string
);
else
mblen
=
1
;
}
if
(
need
_quote
)
if
(
use
_quote
)
CopySendChar
(
quotec
);
for
(;
(
c
=
*
string
)
!=
'\0'
;
string
+=
mblen
)
{
if
(
need
_quote
&&
(
c
==
quotec
||
c
==
escapec
))
if
(
use
_quote
&&
(
c
==
quotec
||
c
==
escapec
))
CopySendChar
(
escapec
);
CopySendChar
(
c
);
...
...
@@ -2615,7 +2614,7 @@ CopyAttributeOutCSV(char *server_string, char *delim, char *quote,
mblen
=
1
;
}
if
(
need
_quote
)
if
(
use
_quote
)
CopySendChar
(
quotec
);
}
...
...
src/backend/parser/gram.y
浏览文件 @
49d3d9cf
...
...
@@ -11,7 +11,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.45
1 2004/04/19 17:22:30
momjian Exp $
* $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.45
2 2004/04/21 00:34:18
momjian Exp $
*
* HISTORY
* AUTHOR DATE MAJOR EVENT
...
...
@@ -370,7 +370,7 @@ static void doNegateFloat(Value *v);
KEY
LANCOMPILER LANGUAGE LARGE_P LAST_P LEADING LEFT LEVEL LIKE LIMIT
LISTEN L
ITERAL L
OAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
LISTEN LOAD LOCAL LOCALTIME LOCALTIMESTAMP LOCATION
LOCK_P
MATCH MAXVALUE MINUTE_P MINVALUE MODE MONTH_P MOVE
...
...
@@ -1374,13 +1374,13 @@ copy_opt_item:
{
$$ = makeDefElem("escape", (Node *)makeString($3));
}
| FORCE columnList
| FORCE
QUOTE
columnList
{
$$ = makeDefElem("force
", (Node *)$2
);
$$ = makeDefElem("force
_quote", (Node *)$3
);
}
|
LITERAL
columnList
|
FORCE NOT NULL_P
columnList
{
$$ = makeDefElem("
literal", (Node *)$2
);
$$ = makeDefElem("
force_notnull", (Node *)$4
);
}
;
...
...
@@ -7496,7 +7496,6 @@ unreserved_keyword:
| LAST_P
| LEVEL
| LISTEN
| LITERAL
| LOAD
| LOCAL
| LOCATION
...
...
src/backend/parser/keywords.c
浏览文件 @
49d3d9cf
...
...
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.14
8 2004/04/19 17:22:31
momjian Exp $
* $PostgreSQL: pgsql/src/backend/parser/keywords.c,v 1.14
9 2004/04/21 00:34:18
momjian Exp $
*
*-------------------------------------------------------------------------
*/
...
...
@@ -187,7 +187,6 @@ static const ScanKeyword ScanKeywords[] = {
{
"like"
,
LIKE
},
{
"limit"
,
LIMIT
},
{
"listen"
,
LISTEN
},
{
"literal"
,
LITERAL
},
{
"load"
,
LOAD
},
{
"local"
,
LOCAL
},
{
"localtime"
,
LOCALTIME
},
...
...
src/bin/psql/copy.c
浏览文件 @
49d3d9cf
...
...
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2003, PostgreSQL Global Development Group
*
* $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.4
5 2004/04/19 17:42:5
8 momjian Exp $
* $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.4
6 2004/04/21 00:34:1
8 momjian Exp $
*/
#include "postgres_fe.h"
#include "copy.h"
...
...
@@ -71,8 +71,8 @@ struct copy_options
char
*
null
;
char
*
quote
;
char
*
escape
;
char
*
force_list
;
char
*
litera
l_list
;
char
*
force_
quote_
list
;
char
*
force_notnul
l_list
;
};
...
...
@@ -88,8 +88,8 @@ free_copy_options(struct copy_options * ptr)
free
(
ptr
->
null
);
free
(
ptr
->
quote
);
free
(
ptr
->
escape
);
free
(
ptr
->
force_list
);
free
(
ptr
->
litera
l_list
);
free
(
ptr
->
force_
quote_
list
);
free
(
ptr
->
force_notnul
l_list
);
free
(
ptr
);
}
...
...
@@ -344,45 +344,56 @@ parse_slash_copy(const char *args)
}
else
if
(
strcasecmp
(
token
,
"force"
)
==
0
)
{
/* handle column list */
fetch_next
=
false
;
for
(;;
)
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
)
;
if
(
strcasecmp
(
token
,
"quote"
)
==
0
)
{
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
);
if
(
!
token
||
strchr
(
","
,
token
[
0
]))
goto
error
;
if
(
!
result
->
force_list
)
result
->
force_list
=
pg_strdup
(
token
);
else
xstrcat
(
&
result
->
force_list
,
token
);
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
);
if
(
!
token
||
token
[
0
]
!=
','
)
break
;
xstrcat
(
&
result
->
force_list
,
token
);
/* handle column list */
fetch_next
=
false
;
for
(;;)
{
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
);
if
(
!
token
||
strchr
(
","
,
token
[
0
]))
goto
error
;
if
(
!
result
->
force_quote_list
)
result
->
force_quote_list
=
pg_strdup
(
token
);
else
xstrcat
(
&
result
->
force_quote_list
,
token
);
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
);
if
(
!
token
||
token
[
0
]
!=
','
)
break
;
xstrcat
(
&
result
->
force_quote_list
,
token
);
}
}
}
else
if
(
strcasecmp
(
token
,
"literal"
)
==
0
)
{
/* handle column list */
fetch_next
=
false
;
for
(;;)
else
if
(
strcasecmp
(
token
,
"not"
)
==
0
)
{
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
);
if
(
!
token
||
strchr
(
","
,
token
[
0
])
)
if
(
strcasecmp
(
token
,
"null"
)
!=
0
)
goto
error
;
if
(
!
result
->
literal_list
)
result
->
literal_list
=
pg_strdup
(
token
);
else
xstrcat
(
&
result
->
literal_list
,
token
);
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
);
if
(
!
token
||
token
[
0
]
!=
','
)
break
;
xstrcat
(
&
result
->
literal_list
,
token
);
/* handle column list */
fetch_next
=
false
;
for
(;;)
{
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
);
if
(
!
token
||
strchr
(
","
,
token
[
0
]))
goto
error
;
if
(
!
result
->
force_notnull_list
)
result
->
force_notnull_list
=
pg_strdup
(
token
);
else
xstrcat
(
&
result
->
force_notnull_list
,
token
);
token
=
strtokx
(
NULL
,
whitespace
,
","
,
"
\"
"
,
0
,
false
,
pset
.
encoding
);
if
(
!
token
||
token
[
0
]
!=
','
)
break
;
xstrcat
(
&
result
->
force_notnull_list
,
token
);
}
}
else
goto
error
;
}
else
goto
error
;
...
...
@@ -493,14 +504,14 @@ do_copy(const char *args)
appendPQExpBuffer
(
&
query
,
" ESCAPE AS '%s'"
,
options
->
escape
);
}
if
(
options
->
force_list
)
if
(
options
->
force_
quote_
list
)
{
appendPQExpBuffer
(
&
query
,
" FORCE
%s"
,
options
->
forc
e_list
);
appendPQExpBuffer
(
&
query
,
" FORCE
QUOTE %s"
,
options
->
force_quot
e_list
);
}
if
(
options
->
litera
l_list
)
if
(
options
->
force_notnul
l_list
)
{
appendPQExpBuffer
(
&
query
,
"
LITERAL %s"
,
options
->
litera
l_list
);
appendPQExpBuffer
(
&
query
,
"
FORCE NOT NULL %s"
,
options
->
force_notnul
l_list
);
}
if
(
options
->
from
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录