Skip to content

Commit a0d8733

Browse files
committed
first try to fix #114
1 parent d40d5be commit a0d8733

File tree

4 files changed

+51
-20
lines changed

4 files changed

+51
-20
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ Also I would like to know about needed examples or documentation stuff.
3636

3737
## Extensions in the latest SNAPSHOT version 0.9.3
3838

39+
* First support for Postgresql arrays. Some quoted identifier rules for SQLServer
40+
had to be changed.
3941
* support for with recursive
4042

4143
```sql

src/main/java/net/sf/jsqlparser/statement/create/table/ColDataType.java

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,33 @@
2121
*/
2222
package net.sf.jsqlparser.statement.create.table;
2323

24+
import java.util.ArrayList;
2425
import java.util.List;
2526

2627
import net.sf.jsqlparser.statement.select.PlainSelect;
2728

2829
public class ColDataType {
2930

30-
private String dataType;
31-
private List<String> argumentsStringList;
31+
private String dataType;
32+
private List<String> argumentsStringList;
3233
private String characterSet;
34+
private List<Integer> arrayData = new ArrayList<Integer>();
3335

34-
public List<String> getArgumentsStringList() {
35-
return argumentsStringList;
36-
}
36+
public List<String> getArgumentsStringList() {
37+
return argumentsStringList;
38+
}
3739

38-
public String getDataType() {
39-
return dataType;
40-
}
40+
public String getDataType() {
41+
return dataType;
42+
}
4143

42-
public void setArgumentsStringList(List<String> list) {
43-
argumentsStringList = list;
44-
}
44+
public void setArgumentsStringList(List<String> list) {
45+
argumentsStringList = list;
46+
}
4547

46-
public void setDataType(String string) {
47-
dataType = string;
48-
}
48+
public void setDataType(String string) {
49+
dataType = string;
50+
}
4951

5052
public String getCharacterSet() {
5153
return characterSet;
@@ -55,10 +57,27 @@ public void setCharacterSet(String characterSet) {
5557
this.characterSet = characterSet;
5658
}
5759

58-
@Override
59-
public String toString() {
60-
return dataType
61-
+ (argumentsStringList != null ? " " + PlainSelect.getStringList(argumentsStringList, true, true) : "")
60+
public List<Integer> getArrayData() {
61+
return arrayData;
62+
}
63+
64+
public void setArrayData(List<Integer> arrayData) {
65+
this.arrayData = arrayData;
66+
}
67+
68+
@Override
69+
public String toString() {
70+
StringBuilder arraySpec = new StringBuilder();
71+
for (Integer item : arrayData) {
72+
arraySpec.append("[");
73+
if (item != null) {
74+
arraySpec.append(item);
75+
}
76+
arraySpec.append("]");
77+
}
78+
return dataType
79+
+ (argumentsStringList != null ? " " + PlainSelect.getStringList(argumentsStringList, true, true) : "")
80+
+ arraySpec.toString()
6281
+ (characterSet != null ? " CHARACTER SET " + characterSet : "");
63-
}
82+
}
6483
}

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ TOKEN:
235235
| < #LETTER: ["a"-"z", "A"-"Z", "_", "$"] >
236236
| < #SPECIAL_CHARS: "$" | "_" | "#" | "@">
237237
| < S_CHAR_LITERAL: "'" (~["'"])* "'" ("'" (~["'"])* "'")*>
238-
| < S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" | ("`" (~["\n","\r","`"])* "`") | ("[" (~["\n","\r","]"])* "]") >
238+
| < S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])+ "\"" | ("`" (~["\n","\r","`"])+ "`") | ( "[" ~["0"-"9","]"] (~["\n","\r","]"])* "]" ) >
239239

240240
/*
241241
To deal with database names (columns, tables) using not only latin base characters, one
@@ -2323,12 +2323,14 @@ ColDataType ColDataType():
23232323
Token tk = null;
23242324
Token tk2 = null;
23252325
ArrayList argumentsStringList = new ArrayList();
2326+
List<Integer> array = new ArrayList<Integer>();
23262327
}
23272328
{
23282329
( tk=<K_CHARACTER> tk2=<K_VARYING> { colDataType.setDataType(tk.image + " " + tk2.image); }
23292330
| tk=<S_IDENTIFIER> { colDataType.setDataType(tk.image); } )
23302331

23312332
[LOOKAHEAD(2) "(" ( (tk=<S_LONG> | tk=<S_CHAR_LITERAL>) { argumentsStringList.add(tk.image); } ["," {/*argumentsStringList.add(",");*/}] )* ")"]
2333+
[( "[" {tk=null;} [ tk=<S_LONG> ] { array.add(tk!=null?Integer.valueOf(tk.image):null); } "]" )+ { colDataType.setArrayData(array); } ]
23322334
[<K_CHARACTER> <K_SET> tk=<S_IDENTIFIER> { colDataType.setCharacterSet(tk.image); } ]
23332335

23342336
{

src/test/java/net/sf/jsqlparser/test/create/CreateTableTest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,14 @@ public void testCreateTableVeryComplex() throws JSQLParserException {
141141
assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_usermeta` ( `umeta_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_id` bigint(20) unsigned NOT NULL DEFAULT '0', `meta_key` varchar(255) DEFAULT NULL, `meta_value` longtext, PRIMARY KEY (`umeta_id`), KEY `user_id` (`user_id`), KEY `meta_key` (`meta_key`) ) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8",true);
142142
assertSqlCanBeParsedAndDeparsed("CREATE TABLE `wp_users` ( `ID` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `user_login` varchar(60) NOT NULL DEFAULT '', `user_pass` varchar(64) NOT NULL DEFAULT '', `user_nicename` varchar(50) NOT NULL DEFAULT '', `user_email` varchar(100) NOT NULL DEFAULT '', `user_url` varchar(100) NOT NULL DEFAULT '', `user_registered` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', `user_activation_key` varchar(60) NOT NULL DEFAULT '', `user_status` int(11) NOT NULL DEFAULT '0', `display_name` varchar(250) NOT NULL DEFAULT '', PRIMARY KEY (`ID`), KEY `user_login_key` (`user_login`), KEY `user_nicename` (`user_nicename`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8",true);
143143
}
144+
145+
public void testCreateTableArrays() throws JSQLParserException {
146+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE sal_emp (name text, pay_by_quarter integer[], schedule text[][])");
147+
}
148+
149+
public void testCreateTableArrays2() throws JSQLParserException {
150+
assertSqlCanBeParsedAndDeparsed("CREATE TABLE sal_emp (name text, pay_by_quarter integer[5], schedule text[3][2])");
151+
}
144152

145153
public void testRUBiSCreateList() throws Exception {
146154
BufferedReader in = new BufferedReader(new InputStreamReader(CreateTableTest.class.getResourceAsStream("/RUBiS-create-requests.txt")));

0 commit comments

Comments
 (0)