File Coverage

blib/lib/String/SQLColumnName.pm
Criterion Covered Total %
statement 68 72 94.4
branch 5 6 83.3
condition n/a
subroutine 13 14 92.8
pod 6 6 100.0
total 92 98 93.8


line stmt bran cond sub pod time code
1 3     3   51656 use strict;
  3         5  
  3         86  
2 3     3   11 use warnings;
  3         4  
  3         150  
3             package String::SQLColumnName;
4              
5             # ABSTRACT: Fix strings into valid SQL column names
6              
7             our $VERSION = '0.02'; # VERSION
8            
9 3     3   60 use 5.010001;
  3         12  
10 3     3   12 use strict;
  3         3  
  3         54  
11 3     3   9 use warnings;
  3         6  
  3         77  
12            
13 3     3   9 use Exporter;
  3         5  
  3         254  
14             our @ISA = qw(Exporter);
15             our @EXPORT_OK = qw(
16             fix_name
17             fix_reserved
18             fix_number
19             fix_ordinal
20             fix_names
21             );
22              
23 3     3   2091 use Lingua::EN::Numbers qw(num2en num2en_ordinal);
  3         5412  
  3         200  
24 3     3   1508 use String::CamelCase qw(camelize);
  3         1419  
  3         5853  
25              
26             our $camelize;
27              
28             our %rw = (
29             "ASYMMETRIC" => 1,
30             "AT" => 1,
31             "ATOMIC" => 1,
32             "ATTRIBUTE" => 1,
33             "ATTRIBUTES" => 1,
34             "AUDIT" => 1,
35             "AUTHORIZATION" => 1,
36             "AUTO_INCREMENT" => 1,
37             "AVG" => 1,
38             "AVG_ROW_LENGTH" => 1,
39             "BACKUP" => 1,
40             "BACKWARD" => 1,
41             "BEFORE" => 1,
42             "BEGIN" => 1,
43             "BERNOULLI" => 1,
44             "BETWEEN" => 1,
45             "BIGINT" => 1,
46             "BINARY" => 1,
47             "BIT" => 1,
48             "BIT_LENGTH" => 1,
49             "BITVAR" => 1,
50             "BLOB" => 1,
51             "BOOL" => 1,
52             "BOOLEAN" => 1,
53             "BOTH" => 1,
54             "BREADTH" => 1,
55             "BREAK" => 1,
56             "BROWSE" => 1,
57             "BULK" => 1,
58             "BY" => 1,
59             "C" => 1,
60             "CACHE" => 1,
61             "CALL" => 1,
62             "CALLED" => 1,
63             "CARDINALITY" => 1,
64             "CASCADE" => 1,
65             "CASCADED" => 1,
66             "CASE" => 1,
67             "CAST" => 1,
68             "CATALOG" => 1,
69             "CATALOG_NAME" => 1,
70             "CEIL" => 1,
71             "CEILING" => 1,
72             "CHAIN" => 1,
73             "CHANGE" => 1,
74             "CHAR" => 1,
75             "CHAR_LENGTH" => 1,
76             "CHARACTER" => 1,
77             "CHARACTER_LENGTH" => 1,
78             "CHARACTER_SET_CATALOG" => 1,
79             "CHARACTER_SET_NAME" => 1,
80             "CHARACTER_SET_SCHEMA" => 1,
81             "CHARACTERISTICS" => 1,
82             "CHARACTERS" => 1,
83             "CHECK" => 1,
84             "CHECKED" => 1,
85             "CHECKPOINT" => 1,
86             "CHECKSUM" => 1,
87             "CLASS" => 1,
88             "CLASS_ORIGIN" => 1,
89             "CLOB" => 1,
90             "CLOSE" => 1,
91             "CLUSTER" => 1,
92             "CLUSTERED" => 1,
93             "COALESCE" => 1,
94             "COBOL" => 1,
95             "COLLATE" => 1,
96             "COLLATION" => 1,
97             "COLLATION_CATALOG" => 1,
98             "COLLATION_NAME" => 1,
99             "COLLATION_SCHEMA" => 1,
100             "COLLECT" => 1,
101             "COLUMN" => 1,
102             "COLUMN_NAME" => 1,
103             "COLUMNS" => 1,
104             "COMMAND_FUNCTION" => 1,
105             "COMMAND_FUNCTION_CODE" => 1,
106             "COMMENT" => 1,
107             "COMMIT" => 1,
108             "COMMITTED" => 1,
109             "COMPLETION" => 1,
110             "COMPRESS" => 1,
111             "COMPUTE" => 1,
112             "CONDITION" => 1,
113             "CONDITION_NUMBER" => 1,
114             "CONNECT" => 1,
115             "CONNECTION" => 1,
116             "CONNECTION_NAME" => 1,
117             "CONSTRAINT" => 1,
118             "CONSTRAINT_CATALOG" => 1,
119             "CONSTRAINT_NAME" => 1,
120             "CONSTRAINT_SCHEMA" => 1,
121             "CONSTRAINTS" => 1,
122             "CONSTRUCTOR" => 1,
123             "CONTAINS" => 1,
124             "CONTAINSTABLE" => 1,
125             "CONTINUE" => 1,
126             "CONVERSION" => 1,
127             "CONVERT" => 1,
128             "COPY" => 1,
129             "CORR" => 1,
130             "CORRESPONDING" => 1,
131             "COUNT" => 1,
132             "COVAR_POP" => 1,
133             "COVAR_SAMP" => 1,
134             "CREATE" => 1,
135             "CREATEDB" => 1,
136             "CREATEROLE" => 1,
137             "CREATEUSER" => 1,
138             "CROSS" => 1,
139             "CSV" => 1,
140             "CUBE" => 1,
141             "CUME_DIST" => 1,
142             "CURRENT" => 1,
143             "CURRENT_DATE" => 1,
144             "CURRENT_DEFAULT_TRANSFORM_GROUP" => 1,
145             "CURRENT_PATH" => 1,
146             "CURRENT_ROLE" => 1,
147             "CURRENT_TIME" => 1,
148             "CURRENT_TIMESTAMP" => 1,
149             "CURRENT_TRANSFORM_GROUP_FOR_TYPE" => 1,
150             "CURRENT_USER" => 1,
151             "CURSOR" => 1,
152             "CURSOR_NAME" => 1,
153             "CYCLE" => 1,
154             "DATA" => 1,
155             "DATABASE" => 1,
156             "DATABASES" => 1,
157             "DATE" => 1,
158             "DATETIME" => 1,
159             "DATETIME_INTERVAL_CODE" => 1,
160             "DATETIME_INTERVAL_PRECISION" => 1,
161             "DAY" => 1,
162             "DAY_HOUR" => 1,
163             "DAY_MICROSECOND" => 1,
164             "DAY_MINUTE" => 1,
165             "DAY_SECOND" => 1,
166             "DAYOFMONTH" => 1,
167             "DAYOFWEEK" => 1,
168             "DAYOFYEAR" => 1,
169             "DBCC" => 1,
170             "DEALLOCATE" => 1,
171             "DEC" => 1,
172             "DECIMAL" => 1,
173             "DECLARE" => 1,
174             "DEFAULT" => 1,
175             "DEFAULTS" => 1,
176             "DEFERRABLE" => 1,
177             "DEFERRED" => 1,
178             "DEFINED" => 1,
179             "DEFINER" => 1,
180             "DEGREE" => 1,
181             "DELAY_KEY_WRITE" => 1,
182             "DELAYED" => 1,
183             "DELETE" => 1,
184             "DELIMITER" => 1,
185             "DELIMITERS" => 1,
186             "DENSE_RANK" => 1,
187             "DENY" => 1,
188             "DEPTH" => 1,
189             "DEREF" => 1,
190             "DERIVED" => 1,
191             "DESC" => 1,
192             "DESCRIBE" => 1,
193             "DESCRIPTOR" => 1,
194             "DESTROY" => 1,
195             "DESTRUCTOR" => 1,
196             "DETERMINISTIC" => 1,
197             "DIAGNOSTICS" => 1,
198             "DICTIONARY" => 1,
199             "DISABLE" => 1,
200             "DISCONNECT" => 1,
201             "DISK" => 1,
202             "DISPATCH" => 1,
203             "DISTINCT" => 1,
204             "DISTINCTROW" => 1,
205             "DISTRIBUTED" => 1,
206             "DIV" => 1,
207             "DO" => 1,
208             "DOMAIN" => 1,
209             "DOUBLE" => 1,
210             "DROP" => 1,
211             "DUAL" => 1,
212             "DUMMY" => 1,
213             "DUMP" => 1,
214             "DYNAMIC" => 1,
215             "DYNAMIC_FUNCTION" => 1,
216             "DYNAMIC_FUNCTION_CODE" => 1,
217             "EACH" => 1,
218             "ELEMENT" => 1,
219             "ELSE" => 1,
220             "ELSEIF" => 1,
221             "ENABLE" => 1,
222             "ENCLOSED" => 1,
223             "ENCODING" => 1,
224             "ENCRYPTED" => 1,
225             "END" => 1,
226             "END-EXEC" => 1,
227             "ENUM" => 1,
228             "EQUALS" => 1,
229             "ERRLVL" => 1,
230             "ESCAPE" => 1,
231             "ESCAPED" => 1,
232             "EVERY" => 1,
233             "EXCEPT" => 1,
234             "EXCEPTION" => 1,
235             "EXCLUDE" => 1,
236             "EXCLUDING" => 1,
237             "EXCLUSIVE" => 1,
238             "EXEC" => 1,
239             "EXECUTE" => 1,
240             "EXISTING" => 1,
241             "EXISTS" => 1,
242             "EXIT" => 1,
243             "EXP" => 1,
244             "EXPLAIN" => 1,
245             "EXTERNAL" => 1,
246             "EXTRACT" => 1,
247             "FALSE" => 1,
248             "FETCH" => 1,
249             "FIELDS" => 1,
250             "FILE" => 1,
251             "FILLFACTOR" => 1,
252             "FILTER" => 1,
253             "FINAL" => 1,
254             "FIRST" => 1,
255             "FLOAT" => 1,
256             "FLOAT4" => 1,
257             "FLOAT8" => 1,
258             "FLOOR" => 1,
259             "FLUSH" => 1,
260             "FOLLOWING" => 1,
261             "FOR" => 1,
262             "FORCE" => 1,
263             "FOREIGN" => 1,
264             "FORTRAN" => 1,
265             "FORWARD" => 1,
266             "FOUND" => 1,
267             "FREE" => 1,
268             "FREETEXT" => 1,
269             "FREETEXTTABLE" => 1,
270             "FREEZE" => 1,
271             "FROM" => 1,
272             "FULL" => 1,
273             "FULLTEXT" => 1,
274             "FUNCTION" => 1,
275             "FUSION" => 1,
276             "G" => 1,
277             "GENERAL" => 1,
278             "GENERATED" => 1,
279             "GET" => 1,
280             "GLOBAL" => 1,
281             "GO" => 1,
282             "GOTO" => 1,
283             "GRANT" => 1,
284             "GRANTED" => 1,
285             "GRANTS" => 1,
286             "GREATEST" => 1,
287             "GROUP" => 1,
288             "GROUPING" => 1,
289             "HANDLER" => 1,
290             "HAVING" => 1,
291             "HEADER" => 1,
292             "HEAP" => 1,
293             "HIERARCHY" => 1,
294             "HIGH_PRIORITY" => 1,
295             "HOLD" => 1,
296             "HOLDLOCK" => 1,
297             "HOST" => 1,
298             "HOSTS" => 1,
299             "HOUR" => 1,
300             "HOUR_MICROSECOND" => 1,
301             "HOUR_MINUTE" => 1,
302             "HOUR_SECOND" => 1,
303             "IDENTIFIED" => 1,
304             "IDENTITY" => 1,
305             "IDENTITY_INSERT" => 1,
306             "IDENTITYCOL" => 1,
307             "IF" => 1,
308             "IGNORE" => 1,
309             "ILIKE" => 1,
310             "IMMEDIATE" => 1,
311             "IMMUTABLE" => 1,
312             "IMPLEMENTATION" => 1,
313             "IMPLICIT" => 1,
314             "IN" => 1,
315             "INCLUDE" => 1,
316             "INCLUDING" => 1,
317             "INCREMENT" => 1,
318             "INDEX" => 1,
319             "INDICATOR" => 1,
320             "INFILE" => 1,
321             "INFIX" => 1,
322             "INHERIT" => 1,
323             "INHERITS" => 1,
324             "INITIAL" => 1,
325             "INITIALIZE" => 1,
326             "INITIALLY" => 1,
327             "INNER" => 1,
328             "INOUT" => 1,
329             "INPUT" => 1,
330             "INSENSITIVE" => 1,
331             "INSERT" => 1,
332             "INSERT_ID" => 1,
333             "INSTANCE" => 1,
334             "INSTANTIABLE" => 1,
335             "INSTEAD" => 1,
336             "INT" => 1,
337             "INT1" => 1,
338             "INT2" => 1,
339             "INT3" => 1,
340             "INT4" => 1,
341             "INT8" => 1,
342             "INTEGER" => 1,
343             "INTERSECT" => 1,
344             "INTERSECTION" => 1,
345             "INTERVAL" => 1,
346             "INTO" => 1,
347             "INVOKER" => 1,
348             "IS" => 1,
349             "ISAM" => 1,
350             "ISNULL" => 1,
351             "ISOLATION" => 1,
352             "ITERATE" => 1,
353             "JOIN" => 1,
354             "K" => 1,
355             "KEY" => 1,
356             "KEY_MEMBER" => 1,
357             "KEY_TYPE" => 1,
358             "KEYS" => 1,
359             "KILL" => 1,
360             "LANCOMPILER" => 1,
361             "LANGUAGE" => 1,
362             "LARGE" => 1,
363             "LAST" => 1,
364             "LAST_INSERT_ID" => 1,
365             "LATERAL" => 1,
366             "LEADING" => 1,
367             "LEAST" => 1,
368             "LEAVE" => 1,
369             "LEFT" => 1,
370             "LENGTH" => 1,
371             "LESS" => 1,
372             "LEVEL" => 1,
373             "LIKE" => 1,
374             "LIMIT" => 1,
375             "LINENO" => 1,
376             "LINES" => 1,
377             "LISTEN" => 1,
378             "LN" => 1,
379             "LOAD" => 1,
380             "LOCAL" => 1,
381             "LOCALTIME" => 1,
382             "LOCALTIMESTAMP" => 1,
383             "LOCATION" => 1,
384             "LOCATOR" => 1,
385             "LOCK" => 1,
386             "LOGIN" => 1,
387             "LOGS" => 1,
388             "LONG" => 1,
389             "LONGBLOB" => 1,
390             "LONGTEXT" => 1,
391             "LOOP" => 1,
392             "LOW_PRIORITY" => 1,
393             "LOWER" => 1,
394             "M" => 1,
395             "MAP" => 1,
396             "MATCH" => 1,
397             "MATCHED" => 1,
398             "MAX" => 1,
399             "MAX_ROWS" => 1,
400             "MAXEXTENTS" => 1,
401             "MAXVALUE" => 1,
402             "MEDIUMBLOB" => 1,
403             "MEDIUMINT" => 1,
404             "MEDIUMTEXT" => 1,
405             "MEMBER" => 1,
406             "MERGE" => 1,
407             "MESSAGE_LENGTH" => 1,
408             "MESSAGE_OCTET_LENGTH" => 1,
409             "MESSAGE_TEXT" => 1,
410             "METHOD" => 1,
411             "MIDDLEINT" => 1,
412             "MIN" => 1,
413             "MIN_ROWS" => 1,
414             "MINUS" => 1,
415             "MINUTE" => 1,
416             "MINUTE_MICROSECOND" => 1,
417             "MINUTE_SECOND" => 1,
418             "MINVALUE" => 1,
419             "MLSLABEL" => 1,
420             "MOD" => 1,
421             "MODE" => 1,
422             "MODIFIES" => 1,
423             "MODIFY" => 1,
424             "MODULE" => 1,
425             "MONTH" => 1,
426             "MONTHNAME" => 1,
427             "MORE" => 1,
428             "MOVE" => 1,
429             "MULTISET" => 1,
430             "MUMPS" => 1,
431             "MYISAM" => 1,
432             "NAME" => 1,
433             "NAMES" => 1,
434             "NATIONAL" => 1,
435             "NATURAL" => 1,
436             "NCHAR" => 1,
437             "NCLOB" => 1,
438             "NESTING" => 1,
439             "NEW" => 1,
440             "NEXT" => 1,
441             "NO" => 1,
442             "NO_WRITE_TO_BINLOG" => 1,
443             "NOAUDIT" => 1,
444             "NOCHECK" => 1,
445             "NOCOMPRESS" => 1,
446             "NOCREATEDB" => 1,
447             "NOCREATEROLE" => 1,
448             "NOCREATEUSER" => 1,
449             "NOINHERIT" => 1,
450             "NOLOGIN" => 1,
451             "NONCLUSTERED" => 1,
452             "NONE" => 1,
453             "NORMALIZE" => 1,
454             "NORMALIZED" => 1,
455             "NOSUPERUSER" => 1,
456             "NOT" => 1,
457             "NOTHING" => 1,
458             "NOTIFY" => 1,
459             "NOTNULL" => 1,
460             "NOWAIT" => 1,
461             "NULL" => 1,
462             "NULLABLE" => 1,
463             "NULLIF" => 1,
464             "NULLS" => 1,
465             "NUMBER" => 1,
466             "NUMERIC" => 1,
467             "OBJECT" => 1,
468             "OCTET_LENGTH" => 1,
469             "OCTETS" => 1,
470             "OF" => 1,
471             "OFF" => 1,
472             "OFFLINE" => 1,
473             "OFFSET" => 1,
474             "OFFSETS" => 1,
475             "OIDS" => 1,
476             "OLD" => 1,
477             "ON" => 1,
478             "ONLINE" => 1,
479             "ONLY" => 1,
480             "OPEN" => 1,
481             "OPENDATASOURCE" => 1,
482             "OPENQUERY" => 1,
483             "OPENROWSET" => 1,
484             "OPENXML" => 1,
485             "OPERATION" => 1,
486             "OPERATOR" => 1,
487             "OPTIMIZE" => 1,
488             "OPTION" => 1,
489             "OPTIONALLY" => 1,
490             "OPTIONS" => 1,
491             "OR" => 1,
492             "ORDER" => 1,
493             "ORDERING" => 1,
494             "ORDINALITY" => 1,
495             "OTHERS" => 1,
496             "OUT" => 1,
497             "OUTER" => 1,
498             "OUTFILE" => 1,
499             "OUTPUT" => 1,
500             "OVER" => 1,
501             "OVERLAPS" => 1,
502             "OVERLAY" => 1,
503             "OVERRIDING" => 1,
504             "OWNER" => 1,
505             "PACK_KEYS" => 1,
506             "PAD" => 1,
507             "PARAMETER" => 1,
508             "PARAMETER_MODE" => 1,
509             "PARAMETER_NAME" => 1,
510             "PARAMETER_ORDINAL_POSITION" => 1,
511             "PARAMETER_SPECIFIC_CATALOG" => 1,
512             "PARAMETER_SPECIFIC_NAME" => 1,
513             "PARAMETER_SPECIFIC_SCHEMA" => 1,
514             "PARAMETERS" => 1,
515             "PARTIAL" => 1,
516             "PARTITION" => 1,
517             "PASCAL" => 1,
518             "PASSWORD" => 1,
519             "PATH" => 1,
520             "PCTFREE" => 1,
521             "PERCENT" => 1,
522             "PERCENT_RANK" => 1,
523             "PERCENTILE_CONT" => 1,
524             "PERCENTILE_DISC" => 1,
525             "PLACING" => 1,
526             "PLAN" => 1,
527             "PLI" => 1,
528             "POSITION" => 1,
529             "POSTFIX" => 1,
530             "POWER" => 1,
531             "PRECEDING" => 1,
532             "PRECISION" => 1,
533             "PREFIX" => 1,
534             "PREORDER" => 1,
535             "PREPARE" => 1,
536             "PREPARED" => 1,
537             "PRESERVE" => 1,
538             "PRIMARY" => 1,
539             "PRINT" => 1,
540             "PRIOR" => 1,
541             "PRIVILEGES" => 1,
542             "PROC" => 1,
543             "PROCEDURAL" => 1,
544             "PROCEDURE" => 1,
545             "PROCESS" => 1,
546             "PROCESSLIST" => 1,
547             "PUBLIC" => 1,
548             "PURGE" => 1,
549             "QUOTE" => 1,
550             "RAID0" => 1,
551             "RAISERROR" => 1,
552             "RANGE" => 1,
553             "RANK" => 1,
554             "RAW" => 1,
555             "READ" => 1,
556             "READS" => 1,
557             "READTEXT" => 1,
558             "REAL" => 1,
559             "RECHECK" => 1,
560             "RECONFIGURE" => 1,
561             "RECURSIVE" => 1,
562             "REF" => 1,
563             "REFERENCES" => 1,
564             "REFERENCING" => 1,
565             "REGEXP" => 1,
566             "REGR_AVGX" => 1,
567             "REGR_AVGY" => 1,
568             "REGR_COUNT" => 1,
569             "REGR_INTERCEPT" => 1,
570             "REGR_R2" => 1,
571             "REGR_SLOPE" => 1,
572             "REGR_SXX" => 1,
573             "REGR_SXY" => 1,
574             "REGR_SYY" => 1,
575             "REINDEX" => 1,
576             "RELATIVE" => 1,
577             "RELEASE" => 1,
578             "RELOAD" => 1,
579             "RENAME" => 1,
580             "REPEAT" => 1,
581             "REPEATABLE" => 1,
582             "REPLACE" => 1,
583             "REPLICATION" => 1,
584             "REQUIRE" => 1,
585             "RESET" => 1,
586             "RESIGNAL" => 1,
587             "RESOURCE" => 1,
588             "RESTART" => 1,
589             "RESTORE" => 1,
590             "RESTRICT" => 1,
591             "RESULT" => 1,
592             "RETURN" => 1,
593             "RETURNED_CARDINALITY" => 1,
594             "RETURNED_LENGTH" => 1,
595             "RETURNED_OCTET_LENGTH" => 1,
596             "RETURNED_SQLSTATE" => 1,
597             "RETURNS" => 1,
598             "REVOKE" => 1,
599             "RIGHT" => 1,
600             "RLIKE" => 1,
601             "ROLE" => 1,
602             "ROLLBACK" => 1,
603             "ROLLUP" => 1,
604             "ROUTINE" => 1,
605             "ROUTINE_CATALOG" => 1,
606             "ROUTINE_NAME" => 1,
607             "ROUTINE_SCHEMA" => 1,
608             "ROW" => 1,
609             "ROW_COUNT" => 1,
610             "ROW_NUMBER" => 1,
611             "ROWCOUNT" => 1,
612             "ROWGUIDCOL" => 1,
613             "ROWID" => 1,
614             "ROWNUM" => 1,
615             "ROWS" => 1,
616             "RULE" => 1,
617             "SAVE" => 1,
618             "SAVEPOINT" => 1,
619             "SCALE" => 1,
620             "SCHEMA" => 1,
621             "SCHEMA_NAME" => 1,
622             "SCHEMAS" => 1,
623             "SCOPE" => 1,
624             "SCOPE_CATALOG" => 1,
625             "SCOPE_NAME" => 1,
626             "SCOPE_SCHEMA" => 1,
627             "SCROLL" => 1,
628             "SEARCH" => 1,
629             "SECOND" => 1,
630             "SECOND_MICROSECOND" => 1,
631             "SECTION" => 1,
632             "SECURITY" => 1,
633             "SELECT" => 1,
634             "SELF" => 1,
635             "SENSITIVE" => 1,
636             "SEPARATOR" => 1,
637             "SEQUENCE" => 1,
638             "SERIALIZABLE" => 1,
639             "SERVER_NAME" => 1,
640             "SESSION" => 1,
641             "SESSION_USER" => 1,
642             "SET" => 1,
643             "SETOF" => 1,
644             "SETS" => 1,
645             "SETUSER" => 1,
646             "SHARE" => 1,
647             "SHOW" => 1,
648             "SHUTDOWN" => 1,
649             "SIGNAL" => 1,
650             "SIMILAR" => 1,
651             "SIMPLE" => 1,
652             "SIZE" => 1,
653             "SMALLINT" => 1,
654             "SOME" => 1,
655             "SONAME" => 1,
656             "SOURCE" => 1,
657             "SPACE" => 1,
658             "SPATIAL" => 1,
659             "SPECIFIC" => 1,
660             "SPECIFIC_NAME" => 1,
661             "SPECIFICTYPE" => 1,
662             "SQL" => 1,
663             "SQL_BIG_RESULT" => 1,
664             "SQL_BIG_SELECTS" => 1,
665             "SQL_BIG_TABLES" => 1,
666             "SQL_CALC_FOUND_ROWS" => 1,
667             "SQL_LOG_OFF" => 1,
668             "SQL_LOG_UPDATE" => 1,
669             "SQL_LOW_PRIORITY_UPDATES" => 1,
670             "SQL_SELECT_LIMIT" => 1,
671             "SQL_SMALL_RESULT" => 1,
672             "SQL_WARNINGS" => 1,
673             "SQLCA" => 1,
674             "SQLCODE" => 1,
675             "SQLERROR" => 1,
676             "SQLEXCEPTION" => 1,
677             "SQLSTATE" => 1,
678             "SQLWARNING" => 1,
679             "SQRT" => 1,
680             "SSL" => 1,
681             "STABLE" => 1,
682             "START" => 1,
683             "STARTING" => 1,
684             "STATE" => 1,
685             "STATEMENT" => 1,
686             "STATIC" => 1,
687             "STATISTICS" => 1,
688             "STATUS" => 1,
689             "STDDEV_POP" => 1,
690             "STDDEV_SAMP" => 1,
691             "STDIN" => 1,
692             "STDOUT" => 1,
693             "STORAGE" => 1,
694             "STRAIGHT_JOIN" => 1,
695             "STRICT" => 1,
696             "STRING" => 1,
697             "STRUCTURE" => 1,
698             "STYLE" => 1,
699             "SUBCLASS_ORIGIN" => 1,
700             "SUBLIST" => 1,
701             "SUBMULTISET" => 1,
702             "SUBSTRING" => 1,
703             "SUCCESSFUL" => 1,
704             "SUM" => 1,
705             "SUPERUSER" => 1,
706             "SYMMETRIC" => 1,
707             "SYNONYM" => 1,
708             "SYSDATE" => 1,
709             "SYSID" => 1,
710             "SYSTEM" => 1,
711             "SYSTEM_USER" => 1,
712             "TABLE" => 1,
713             "TABLE_NAME" => 1,
714             "TABLES" => 1,
715             "TABLESAMPLE" => 1,
716             "TABLESPACE" => 1,
717             "TEMP" => 1,
718             "TEMPLATE" => 1,
719             "TEMPORARY" => 1,
720             "TERMINATE" => 1,
721             "TERMINATED" => 1,
722             "TEXT" => 1,
723             "TEXTSIZE" => 1,
724             "THAN" => 1,
725             "THEN" => 1,
726             "TIES" => 1,
727             "TIME" => 1,
728             "TIMESTAMP" => 1,
729             "TIMEZONE_HOUR" => 1,
730             "TIMEZONE_MINUTE" => 1,
731             "TINYBLOB" => 1,
732             "TINYINT" => 1,
733             "TINYTEXT" => 1,
734             "TO" => 1,
735             "TOAST" => 1,
736             "TOP" => 1,
737             "TOP_LEVEL_COUNT" => 1,
738             "TRAILING" => 1,
739             "TRAN" => 1,
740             "TRANSACTION" => 1,
741             "TRANSACTION_ACTIVE" => 1,
742             "TRANSACTIONS_COMMITTED" => 1,
743             "TRANSACTIONS_ROLLED_BACK" => 1,
744             "TRANSFORM" => 1,
745             "TRANSFORMS" => 1,
746             "TRANSLATE" => 1,
747             "TRANSLATION" => 1,
748             "TREAT" => 1,
749             "TRIGGER" => 1,
750             "TRIGGER_CATALOG" => 1,
751             "TRIGGER_NAME" => 1,
752             "TRIGGER_SCHEMA" => 1,
753             "TRIM" => 1,
754             "TRUE" => 1,
755             "TRUNCATE" => 1,
756             "TRUSTED" => 1,
757             "TSEQUAL" => 1,
758             "TYPE" => 1,
759             "UESCAPE" => 1,
760             "UID" => 1,
761             "UNBOUNDED" => 1,
762             "UNCOMMITTED" => 1,
763             "UNDER" => 1,
764             "UNDO" => 1,
765             "UNENCRYPTED" => 1,
766             "UNION" => 1,
767             "UNIQUE" => 1,
768             "UNKNOWN" => 1,
769             "UNLISTEN" => 1,
770             "UNLOCK" => 1,
771             "UNNAMED" => 1,
772             "UNNEST" => 1,
773             "UNSIGNED" => 1,
774             "UNTIL" => 1,
775             "UPDATE" => 1,
776             "UPDATETEXT" => 1,
777             "UPPER" => 1,
778             "USAGE" => 1,
779             "USE" => 1,
780             "USER" => 1,
781             "USER_DEFINED_TYPE_CATALOG" => 1,
782             "USER_DEFINED_TYPE_CODE" => 1,
783             "USER_DEFINED_TYPE_NAME" => 1,
784             "USER_DEFINED_TYPE_SCHEMA" => 1,
785             "USING" => 1,
786             "UTC_DATE" => 1,
787             "UTC_TIME" => 1,
788             "UTC_TIMESTAMP" => 1,
789             "VACUUM" => 1,
790             "VALID" => 1,
791             "VALIDATE" => 1,
792             "VALIDATOR" => 1,
793             "VALUE" => 1,
794             "VALUES" => 1,
795             "VAR_POP" => 1,
796             "VAR_SAMP" => 1,
797             "VARBINARY" => 1,
798             "VARCHAR" => 1,
799             "VARCHAR2" => 1,
800             "VARCHARACTER" => 1,
801             "VARIABLE" => 1,
802             "VARIABLES" => 1,
803             "VARYING" => 1,
804             "VERBOSE" => 1,
805             "VIEW" => 1,
806             "VOLATILE" => 1,
807             "WAITFOR" => 1,
808             "WHEN" => 1,
809             "WHENEVER" => 1,
810             "WHERE" => 1,
811             "WHILE" => 1,
812             "WIDTH_BUCKET" => 1,
813             "WINDOW" => 1,
814             "WITH" => 1,
815             "WITHIN" => 1,
816             "WITHOUT" => 1,
817             "WORK" => 1,
818             "WRITE" => 1,
819             "WRITETEXT" => 1,
820             "X509" => 1,
821             "XOR" => 1,
822             "YEAR" => 1,
823             "YEAR_MONTH" => 1,
824             "ZEROFILL" => 1,
825             "ZONE" => 1,
826             );
827              
828              
829             sub fix_chars {
830 14     14 1 16 my $w = shift;
831             # print STDERR "Before: $w";
832 14         20 for ($w) {
833 14         52 s/^\s+|\s+$//g;
834            
835 14         23 s/\-(\d+)/_minus_$1_/g;
836 14         14 s/\&/_and_/g;
837 14         12 s/\+/_plus_/g;
838 14         15 s/\//_or_/g;
839 14         13 s/\*/times/g;
840 14         17 s/%/percent/g;
841 14         41 s/#/nr/g;
842            
843 14         30 s/\-/_/g;
844 14         99 s/\s/_/g;
845 14         19 s/\://g;
846              
847 14         20 s/[()\'\.\"\:\;\,]+//g;
848              
849 14         18 s/\W/_/g;
850 14         18 s/__+/_/g;
851            
852 14         15 s/^_//g;
853            
854 14         24 $_ = lc;
855             }
856 14         36 return $w
857             }
858              
859             sub fix_ordinal {
860 14     14 1 14 my $w = shift;
861 14         29 for ($w) {
862 14         95 my $NUMBER_RE = qr/\b(?:[+-]?)(?=\d|\.\d)\d*(?:\.\d*)?(?:[Ee](?:[+-]?\d+))?/;
863 14         209 my $ORDINAL_NUMBER_RE = qr/($NUMBER_RE)(?:st|nd|rd|th)\b/;
864            
865 14         196 while (/($ORDINAL_NUMBER_RE)/) {
866 5         20 my ($n) = ($1 =~ /(\d+)/);
867 5         16 $n = num2en_ordinal($n);
868 5         268 s/($ORDINAL_NUMBER_RE)/$n/;
869             }
870             }
871 14         26 return $w
872             };
873              
874             sub fix_number {
875 14     14 1 24 my $w = shift;
876 14         22 for ($w) {
877 14 100       45 if (/^(\d+)/) {
878 4         24 my $num = num2en($1);
879 4         214 s/^(\d+)/$num/;
880             }
881             }
882 14         18 return $w;
883             }
884              
885             sub fix_reserved {
886 18     18 1 30 my $w = shift;
887 18 100       82 $w = $rw{uc($w)} ? lc ($w) . '_' : lc($w);
888 18         34 return $w;
889             }
890              
891             sub fix_name {
892 14     14 1 36 my $w = shift;
893 14         32 for ($w) {
894 14         26 $_ = fix_reserved($_);
895 14         28 $_ = fix_ordinal($_);
896 14         25 $_ = fix_number($_);
897 14         25 $_ = fix_chars($_);
898             }
899 14 50       30 $w = camelize($w) if $camelize;
900 14         53 return $w;
901             }
902              
903             sub fix_names {
904 0     0 1   my @w = @_;
905 0           @w = map { fix_name($_) } @w;
  0            
906 0           return @w;
907             }
908              
909             1;
910              
911             #################### pod generated by Pod::Autopod - keep this line to make pod updates possible ####################
912              
913             =head1 NAME
914              
915             String::SQLColumnName
916              
917              
918             =head1 DESCRIPTION
919              
920             ABSTRACT: Fix strings into valid SQL column names
921              
922              
923             =head1 REQUIRES
924              
925             L
926              
927             L
928              
929              
930             =head1 METHODS
931              
932             =head2 fix_chars
933              
934             fix_chars();
935              
936             =head2 fix_name, fix_names
937              
938             fix_name();
939              
940             fix_names();
941              
942             =head2 fix_number
943              
944             fix_number('12 months'); # twelve_months
945             fix_number('52 weeks total'); # fifty_two_weeks_total
946              
947             =head2 fix_ordinal
948              
949             fix_ordinal('1st_date'); # first_date
950              
951             =head2 fix_reserved
952              
953             fix_reserved('group'); # group_
954              
955              
956             =cut
957